Si tout Haches collecte est pas une classe avec son propre nom propriété, alors la propriété DisplayMemberPath = « Nom » peut vous causer de ne pas voir quoi que ce soit. L'utilisation d'une KeyedCollection en tant que ItemsSource est cependant parfaitement satisfaisante. La propriété ItemsSource est la propriété ItemsControl.ItemsSource. Et il exige simplement que tout ce qu'il est obligé d'implémenter IEnumerable.
KeyedCollection met en œuvre IEnumerable, car il implémente Collection.
est un exemple simple en utilisant un KeyedCollection:
<Grid>
<DockPanel x:Name="QuickListButtonsStackPanel">
<Button DockPanel.Dock="Top"
Content="Load Animals"
Click="AnimalButtonClick" />
<Button DockPanel.Dock="Top"
Content="Load Objects"
Click="ObjectButtonClick" />
<TextBlock DockPanel.Dock="Bottom"
Background="Azure"
Text="{Binding SelectedExample}" />
<ListBox x:Name="uiListBox"
ItemsSource="{Binding Examples}"
SelectedItem="{Binding SelectedExample}" />
</DockPanel>
</Grid>
Et le code de notre fenêtre & KeyedCollection:
public partial class Window1 : Window, INotifyPropertyChanged
{
public Window1()
{
InitializeComponent();
this.DataContext = this;
}
public KeyedCollection<char, string> Examples
{
get;
set;
}
private string mySelectedExample;
public string SelectedExample
{
get
{ return this.mySelectedExample; }
set
{
this.mySelectedExample = value;
this.NotifyPropertyChanged("SelectedExample");
}
}
private void AnimalButtonClick(object sender, RoutedEventArgs e)
{
Examples = new AlphabetExampleCollection();
Examples.Add("Ardvark");
Examples.Add("Bat");
Examples.Add("Cat");
Examples.Add("Dingo");
Examples.Add("Emu");
NotifyPropertyChanged("Examples");
}
private void ObjectButtonClick(object sender, RoutedEventArgs e)
{
Examples = new AlphabetExampleCollection();
Examples.Add("Apple");
Examples.Add("Ball");
Examples.Add("Chair");
Examples.Add("Desk");
Examples.Add("Eee PC");
NotifyPropertyChanged("Examples");
}
#region INotifyPropertyChanged Members
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
public class AlphabetExampleCollection : KeyedCollection<char, string>
{
public AlphabetExampleCollection() : base() { }
protected override char GetKeyForItem(string item)
{
return Char.ToUpper(item[0]);
}
}
L'autre question qui peut se produire est si vous êtes l'ajout/suppression éléments de la collection, et ne pas redéfinir la collection. Dans l'exemple ci-dessus, vous pouvez voir que nous réinstallons la collection de clés. Si nous ne l'avons pas fait, appeler simplement NotifyPropertyChanged ne ferait rien.
permet d'ajouter deux autres boutons pour démontrer:
<Button DockPanel.Dock="Top"
Content="Add Zebra"
Click="AddZebraClick" />
<Button DockPanel.Dock="Top"
Content="Add YoYo"
Click="AddYoYoClick" />
Et les Hanlders:
private void AddZebraClick(object sender, RoutedEventArgs e)
{
Examples.Add("Zebra");
NotifyPropertyChanged("Examples");
}
private void AddYoYoClick(object sender, RoutedEventArgs e)
{
Examples.Add("YoYo");
NotifyPropertyChanged("Examples");
}
ces deux, comme cela est ne fonctionnera pas. Lorsque vous appelez NotifyPropertyChanged, la propriété doit être modifiée. Et dans ce cas, ce n'est pas le cas. Nous avons modifié ses éléments, mais la collection Exemples est toujours la même collection.Pour résoudre ce problème, nous le cycle pourrait la collection comme nous l'avons fait dans la première partie, ou si nous avons accès à l'interface utilisateur, nous pourrions appeler:
uiListBox.Items.Refresh();
On pourrait aussi du vélo le DataSource, nous pourrions le cycle ItemsSource de la zone de liste, ou nous pourrions effacer et réaffecter la liaison, mais en appelant simplement UpdateTarget() ne le fera pas cependant.
vous devez marquer le code XAML comme du code ou il n'apparaît pas dans votre question. –