2010-07-27 5 views
1

Я использую WPF и C# У меня есть кнопка, которая открывает окно, которое также включает кнопку, которая добавляет элемент объекта User в список, и я хочу, чтобы индекс списка был обновлен после ввода. Я понял, что решение связано с использованием наблюдаемого класса INotifyCollectionChanged, но на самом деле я не знаю, как и где их использовать. Можете ли вы мне помочь в определении того, что и где осуществить, регистр, огонь и т.д.Обновление списка после добавления нового элемента


Edit: мне удалось это, помощь Quartermeister, где мой объект Пользователь собирается в списке, но сейчас я хочу сделать то же самое, где мой объект собран в словаре

ответ

4

Самый простой способ - использовать System.Collections.ObjectModel.ObservableCollection<T> в качестве вашего списка. Это реализует для вас INotifyCollectionChanged и INotifyPropertyChanged.

У вас будет свойство объекта DataContext этого типа и используйте привязку данных к ListBox.ItemsSource, чтобы привязать его к этому свойству. ListBox автоматически обновит список элементов при изменении коллекции.

В классе, который ваш DataContext:

public class MyClass 
{ 
    public ObservableCollection<string> Items { get; set; } 
} 

В Xaml:

<ListBox ItemsSource="{Binding Items}"> 
</ListBox> 

Это звучит, как вы хотите, наблюдаемую словарь, но, к сожалению, есть не один встроенный в рамки. Вы могли бы попытаться использовать реализацию Dr.Wpf ObservableDictionary со своего поста "Can I bind my ItemsControl to a dictionary?".

+0

Это было довольно простое и полезное решение. Спасибо большое =) – cemregoksu

+0

и еще один вопрос: Что делать, если я хочу использовать словарь вместо списка? как я могу справиться с этим? – cemregoksu

+0

Я только что нашел keyedcollection и теперь попробовал его. Надеюсь, он работает =) t – cemregoksu

0

Реализация наблюдаемого словаря сложна. Гораздо проще поддерживать параллельную наблюдаемую коллекцию, содержащую значения словаря. Привяжите представление к этой коллекции и убедитесь, что любой код, который добавляет или удаляет значения в/из словаря, обновляет как словарь, так и параллельную коллекцию.

Если вы действительно хотите, чтобы сойти с ума, вы могли бы реализовать подкласс ObservableCollection для хранения ваших объектов, и сделать этот класс поддерживать словарь, например:

public class KeyedObject 
{ 
    public string Key { get; set; } 
    public object Value { get; set; } 
} 

public class ObservableMappedCollection : ObservableCollection<KeyedObject> 
{ 
    private Dictionary<string, KeyedObject> _Map; 

    public ObservableMappedCollection(Dictionary<string, KeyedObject> map) 
    { 
     _Map = map;  
    } 

    protected override void InsertItem(int index, KeyedObject item) 
    { 
     base.InsertItem(index, item); 
     _Map[item.Key] = item; 
    } 

    protected override void RemoveItem(int index) 
    { 
     KeyedObject item = base[index]; 
     base.RemoveItem(index); 
     _Map.Remove(item.Key); 
    } 

    protected override void ClearItems() 
    { 
     base.ClearItems(); 
     _Map.Clear(); 
    } 

    protected override void SetItem(int index, KeyedObject item) 
    { 
     KeyedObject oldItem = base[index]; 
     _Map.Remove(oldItem.Key); 
     base.SetItem(index, item); 
     _Map[item.Key] = item; 
    } 
} 

Есть куча потенциальных проблем в выше, в основном связанных с повторяющимися значениями ключа. Например, что должно делать SetItem, если вы добавляете объект, чей ключ уже находится на карте? Ответ действительно зависит от вашего приложения. Подобные проблемы также указывают на то, что в структуре нет наблюдаемого словарного класса.

Смежные вопросы