Использование HashSets с ObservableCollection с WPF

Оператор == всегда предназначен для сравнения ссылок на объекты, тогда как метод сравнения строк .equals () переопределяется для сравнения содержимого:

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // It prints false (reference comparison)
System.out.println(s1.equals(s2)); // It prints true (content comparison)
7
задан Alex Marshall 24 November 2009 в 21:42
поделиться

2 ответа

Когда вы создаете новую коллекцию ObservableCollection с другой коллекцией, вы не обертываете эту коллекцию, вы создаете новую, в которой все элементы переданной коллекции копируются в ObservableCollection. Если вы хотите использовать ObservableCollection для единственной цели DataBinding, не смотрите дальше, вы можете привязаться к любому IEnumerable в WPF. Это, к сожалению, имеет недостаток, заключающийся в том, что WPF не всегда правильно принимает изменения в связанной коллекции. Если это проблема, вам, вероятно, придется создать свой собственный наблюдаемый хэш-набор:

public class ObservableHashSet<T> : ObservableCollection<T>  
{ 
    protected override void InsertItem(int index, T item) 
    { 
        if (Contains(item)) 
        {
            throw new ItemExistsException(item); 
        }
        base.InsertItem(index, item); 
    } 

    protected override void SetItem(int index, T item) 
    { 
        int i = IndexOf(item); 
        if (i >= 0 && i != index)
        {
             throw new ItemExistsException(item); 
        }       
        base.SetItem(index, item); 
    } 
}

РЕДАКТИРОВАТЬ: Как уже было указано, вы не можете наследовать от HashSet для реализации INotifyCollectionChanged. Однако если вы посмотрите на код (с использованием Reflector) для класса HashSet, он довольно прост, и вам будет слишком сложно имитировать эту функциональность самостоятельно.

9
ответ дан 7 December 2019 в 01:22
поделиться

Как сказал bitbonk, ObservableCollection не оборачивает Hashset, а вместо этого копирует его элементы.

Если вы хотите получить Observable Hashset, проверьте Как я могу сделать Observable Hashset на C # ?

0
ответ дан 7 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: