Если любые осей собирают не класс с собственным свойством Name, свойство DisplayMemberPath = «Name» может заставлять вас ничего не видеть.
Однако использование KeyedCollection в качестве элемента Items прекрасно. Свойством ItemsSource является свойство ItemsControl.ItemsSource . И это просто требует, чтобы все, что связано с IEnumerable.
KeyedCollection реализует IEnumerable, поскольку он реализует Collection.
Ниже приведен короткий пример с помощью 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]);
}
}
И код для нашего Window & KeyedCollection:
<Button DockPanel.Dock="Top"
Content="Add Zebra"
Click="AddZebraClick" />
<Button DockPanel.Dock="Top"
Content="Add YoYo"
Click="AddYoYoClick" />
Другая проблема, которая может возникнуть, заключается в том, что вы просто добавляете / удаляете элементы из коллекции, а не повторно устанавливаете коллекцию. В приведенном выше примере вы можете увидеть, что мы обновляем коллекцию ключей. Если бы мы этого не сделали, то просто вызов NotifyPropertyChanged ничего не сделал.
Давайте добавим еще две кнопки, чтобы продемонстрировать это:
private void AddZebraClick(object sender, RoutedEventArgs e)
{
Examples.Add("Zebra");
NotifyPropertyChanged("Examples");
}
private void AddYoYoClick(object sender, RoutedEventArgs e)
{
Examples.Add("YoYo");
NotifyPropertyChanged("Examples");
}
И хандлеров:
uiListBox.Items.Refresh();
Оба эти, как и не будут работать . Когда вы вызываете NotifyPropertyChanged, свойство должно быть действительно изменено. И в этом случае это не так. Мы изменили его элементы, но коллекция примеров по-прежнему остается той же коллекцией. Чтобы исправить это, мы могли бы цитировать коллекцию, как мы это делали в первой части, или если у нас есть доступ к пользовательскому интерфейсу, мы могли бы позвонить:
listboxAxes.Items.Refresh()
Мы также могли бы циклировать DataSource, мы могли бы циклически использовать ItemsSource ListBox, иначе мы могли бы очистить и повторно назначить привязку, но просто вызов UpdateTarget () не будет делать этого.