none
ListBox, selectedItem RRS feed

  • Frage

  • Es scheitert am einfachsten:

    gegeben ist eine ListBox und ein Label. Der ListBoxItem soll bei SelectionChanged an das Label.Content übergeben werden und es geht nicht:

    <ListBox>
    <ListBoxItem>01</ListBoxItem>
    <ListBoxItem>02</ListBoxItem>
    </ListBox>
    
    <Label Name="MyLabel"/>

    Private Sub MyListBox_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs)
            Dim Item As String
            Item = Me.MyListBox.SelectedItem
    
            MyLabel.Content = Item
        End Sub

    Was mache ich hier falsch?

    Es geht mir um WPF(XAML) Visual Studio Proff. 2010, VisualBasic, Win7 und verständliche Hilfe. Als Quelle nutze ich oft msdn Hilfe.

    Dienstag, 24. April 2012 19:47

Antworten

  • Hallo Thomas
    also dafür findest Du schon veiel Beispiele im Netz.

    Ein eher einfaches Beispiel in C# (nicht aufgehübscht, rein funktional..)

    <Window x:Class="WpfApplication1.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window2"
            Height="300"
            Width="300">
        <StackPanel>
            <TextBlock Text="Zahl wählen:" />
            <ListBox ItemsSource="{Binding Path=Numbers}"
                     ItemStringFormat="00"
                     SelectedItem="{Binding Path=SelectedNumber}" />
            <TextBlock Text="{Binding Path=SelectedNumber, StringFormat=Aktuelle Auswahl: 00}" />
        </StackPanel>
    </Window>


    im code behind (ist C#) Window1.xaml.cs


    using System.Collections.Generic;
    using System.ComponentModel;
    
    namespace WpfApplication1
    {
        /// <summary>
        /// Interaktionslogik für Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            public Window1()
            {
                DataContext = new NumberViewModel();
                InitializeComponent();
            }
        }
    
        public class NumberViewModel 
        {
    
            public event PropertyChangedEventHandler PropertyChanged;
            protected void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null && TypeDescriptor.GetProperties(this)[propertyName] != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
            private int _selectedNumber;
            public int SelectedNumber
            {
                get { return _selectedNumber; }
                set
                {
                    _selectedNumber = value;
                    if (value != _selectedNumber)
                    {
                        _selectedNumber = value;
                        NotifyPropertyChanged("SelectedNumber");
                    }
                }
            }
    
            private IList<int> _numbers;
            public IList<int> Numbers
            {
                get
                {
                    if (_numbers == null)
                    {
                        _numbers = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
                    }
                    return _numbers;
                }
            }
        }
    }

    Gruß,
    Christoph


    Mittwoch, 25. April 2012 21:10

Alle Antworten

  • Hi,

    Du würdest das selektierte ListBoxItem in zwei Containern
    unterbringen wollen, das geht nicht: Ein UIElement - ein Parent.
    Das ListBoxItem musst Du auch gar nicht selber erzeugen
    das macht die ListBox für dich,
    Es reicht, den Content zu definieren.
    Um die Selektion zu spiegeln, brauchst Du nur ein Binding in XAML,
    kein code-behind:

    <ListBox Name="myListBox" xmlns:sys="clr-namespace:System;assembly=mscorlib">
                <sys:String>01</sys:String>
                <sys:String>02</sys:String>
            </ListBox>
    
            <Label Name="MyLabel"
                   Content="{Binding ElementName=myListBox,Path=SelectedItem,TargetNullValue=(Keine Auswahl)}" />

    Gruß,
    Christoph


    Dienstag, 24. April 2012 20:47
  • Hallo Christoph

    zunächst vielen Dank für Deine Antwort. Leider kommt die Umsetzung als XAML nicht so richtig in Frage.

    Das Label.Content wird beim Laden des Fensters mit einem Wert aus einer Datenbank geladen.

    Wenn der Nutzer den zuvor geladenen Wert ändern möchte, stehen ihm Werte aus einer Liste zur Verfügung die er durch selectionchanged auswählen kann.

    D.h. das Content des Labels ist bereits beim Laden vergeben.

    So, und ab jetzt weiß ich nicht weiter.


    Es geht mir um WPF(XAML) Visual Studio Proff. 2010, VisualBasic, Win7 und verständliche Hilfe. Als Quelle nutze ich oft msdn Hilfe.

    Mittwoch, 25. April 2012 06:04
  • Hallo Thomas,

    Üblicherweise löst man das mit DataBinding.
    In der ListBox hast Du die erlaubten Werte.
    Wenn sich die Selection ändert, bindest Du eine Property
    deines Datacontext / ViewModel an SelectedItem
    oder SelectedValue.
    An dieselbe Property bindest Du auch Label.Content.
    Datacontext / ViewModel sollte INotifyPropertyChanged unterstützen.

    Christoph
     

    Mittwoch, 25. April 2012 06:58
  • Kannst Du mir zum besseren Verständnis ein Beispiel (-Link) nennen?

    Es geht mir um WPF(XAML) Visual Studio Proff. 2010, VisualBasic, Win7 und verständliche Hilfe. Als Quelle nutze ich oft msdn Hilfe.

    Mittwoch, 25. April 2012 07:17
  • Hallo Thomas
    also dafür findest Du schon veiel Beispiele im Netz.

    Ein eher einfaches Beispiel in C# (nicht aufgehübscht, rein funktional..)

    <Window x:Class="WpfApplication1.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window2"
            Height="300"
            Width="300">
        <StackPanel>
            <TextBlock Text="Zahl wählen:" />
            <ListBox ItemsSource="{Binding Path=Numbers}"
                     ItemStringFormat="00"
                     SelectedItem="{Binding Path=SelectedNumber}" />
            <TextBlock Text="{Binding Path=SelectedNumber, StringFormat=Aktuelle Auswahl: 00}" />
        </StackPanel>
    </Window>


    im code behind (ist C#) Window1.xaml.cs


    using System.Collections.Generic;
    using System.ComponentModel;
    
    namespace WpfApplication1
    {
        /// <summary>
        /// Interaktionslogik für Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            public Window1()
            {
                DataContext = new NumberViewModel();
                InitializeComponent();
            }
        }
    
        public class NumberViewModel 
        {
    
            public event PropertyChangedEventHandler PropertyChanged;
            protected void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null && TypeDescriptor.GetProperties(this)[propertyName] != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
            private int _selectedNumber;
            public int SelectedNumber
            {
                get { return _selectedNumber; }
                set
                {
                    _selectedNumber = value;
                    if (value != _selectedNumber)
                    {
                        _selectedNumber = value;
                        NotifyPropertyChanged("SelectedNumber");
                    }
                }
            }
    
            private IList<int> _numbers;
            public IList<int> Numbers
            {
                get
                {
                    if (_numbers == null)
                    {
                        _numbers = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
                    }
                    return _numbers;
                }
            }
        }
    }

    Gruß,
    Christoph


    Mittwoch, 25. April 2012 21:10
  • Hallo Thomas2705,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 2. Mai 2012 13:44
    Moderator