c # проверить, изменил ли словарь значения в другом классе через обработчик событий? - PullRequest
0 голосов
/ 24 декабря 2011

У меня есть отдельный класс, скажем, class2, со словарем. Я бы хотел, чтобы он заполнил словарь значениями.

public class Class2
{
    public Class2()
    {
         public Dictionary<string, string> someDictionary = new Dictionary<string, string>();
         //I DON"T KNOW HOW TO CREATE AN EVENTHANDLER HERE FOR THE DICTIONARY
         //how do i create the eventhandler if someDictionary changes?
    }
}

скажем, в class1, у меня есть просмотр списка, который я хотел бы заполнить значениями словаря, но меняю их по мере изменения словаря в class2.

public class Class1
{
    public Class1()
    { 
          Class2 class2 = new Class2();
          class2.SomeDictionaryChanged += new EventHandler(someDictionary_SomeDictionaryChanged);
    } 

    void someData_SomeDataChanged(object sender, EventArgs e) 
    {
         listView1.Add(class2.someDictionary); 
    }

} 

как мне создать обработчик событий для словаря в class2 и как проверить, изменился ли словарь в class1?

ВСЕ ЭТО ПСЕВДОКОД, ЭТО НЕ СОБИРАЕТСЯ, Я НЕ ЗНАЮ, КАК ЭТО СДЕЛАТЬ, ЭТО Я ЗАДАЮ ВОПРОС

Ответы [ 2 ]

6 голосов
/ 24 декабря 2011

Проверьте ObservableDictionary. http://blogs.microsoft.co.il/blogs/shimmy/archive/2010/12/26/observabledictionary-lt-tkey-tvalue-gt-c.aspx

Он реализует INotifyCollectionChanged и INotifyPropertyChanged. Вы можете обрабатывать CollectionChanged из одного словаря для обновления другого.

Я не проверял этот код, но он должен направить вас в правильном направлении.

public class Class2 : ObservableDictionary<string, string>
{
    public Class2()
    {
    }
}
public class Class1
{
    public Class1()
    {
        Class2 class2 = new Class2();
        class2.CollectionChanged += new OnCollectionChanged;
    }

    void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (KeyValuePair<string, string> kvp in e.NewItems)
            {
                listView1.Add(kvp.Value);
            }
        }
    }
}

Где class1 расширяет наблюдаемый словарь, который имеет событие CollectionChanged. В class1 вы можете присоединиться к событию CollectionChanged класса2 и использовать его для добавления элементов в список.

0 голосов
/ 24 декабря 2011

Это невозможно, с точки зрения только с использованием словаря .

И вот почему:

  1. Dictionary<TKey, TValue не имеет событий
  2. Сравнение двух Dictionary<TKey, TValue> объектов, имеющих одинаковые типы Tkey и TValue и одинаковое содержимое, будет сравниваться с false, просто потому что .Equals(x) в таком словаре использует сравнение ссылок
  3. Проверка хэш-кода с помощью .GetHashCode() также не будет работать, поскольку хэш-коды двух экземпляров разностного словаря, вероятно, будут разными, даже если словари имеют одинаковое содержимое.

Единственный способ заставить что-то подобное работать - либо:

  1. Подклассы Dictionary<TKey, TValue> и запуск событий для всего, что изменяет словарь (обратите внимание, что я действительно не помню, является ли тип словаря запечатанным или нет, т. Е. Действительно ли это возможно)
  2. Завершение всего доступа к базовому словарю и запуск событий в соответствующих местах
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...