Обновление списка после добавления нового элемента - PullRequest
1 голос
/ 27 июля 2010

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


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

Ответы [ 2 ]

4 голосов
/ 27 июля 2010

Самый простой способ - использовать 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>

Похоже, вы также хотите заметный словарь, но, к сожалению,нет ни одного встроенного в рамки.Вы можете попытаться использовать реализацию ObservableDictionary от доктора Wpf из его поста «Могу ли я связать мой ItemsControl со словарем?» .

0 голосов
/ 27 июля 2010

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

Если вы действительно хотите сходить с ума, вы можете реализоватьподкласс 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, если вы добавляете объект, ключ которого уже есть на карте?Ответ действительно зависит от вашего приложения.Подобные проблемы также намекают на то, почему в структуре нет наблюдаемого словарного класса.

...