Вопрос в том, почему и как синхронизируются CollectionViews?
Они синхронизированы, потому что, хотя оба ListBoxes
имеют разные Items
, они совместно используют один и тот же CollectionView
, который является видом по умолчанию для исходной коллекции.
Свойство Items
ItemsControl
имеет тип ItemCollection
, а свойство CollectionView
ItemCollection
- внутреннее , поэтому мы не можем получить к нему прямой доступ, чтобы убедиться, что это правда , Тем не менее, мы можем просто ввести эти три значения в отладчике, чтобы убедиться в этом, все они выглядят как true
_list1.Items.CollectionView == _list2.Items.CollectionView // true
_list1.Items.CollectionView == CollectionViewSource.GetDefaultView(ints) // true
_list2.Items.CollectionView == CollectionViewSource.GetDefaultView(ints) // true
В качестве альтернативы, мы можем использовать отражение для сравнения в коде
PropertyInfo collectionViewProperty =
typeof(ItemCollection).GetProperty("CollectionView", BindingFlags.NonPublic | BindingFlags.Instance);
ListCollectionView list1CollectionView = collectionViewProperty.GetValue(_list1.Items, null) as ListCollectionView;
ListCollectionView list2CollectionView = collectionViewProperty.GetValue(_list2.Items, null) as ListCollectionView;
ListCollectionView defaultCollectionView = CollectionViewSource.GetDefaultView(ints) as ListCollectionView;
Debug.WriteLine(list1CollectionView == list2CollectionView);
Debug.WriteLine(list1CollectionView == defaultCollectionView);
Debug.WriteLine(list2CollectionView == defaultCollectionView);
Способ обойти это уже был опубликован F Ruffell , создайте новый ListCollectionView
как ItemsSource
для каждого ListBox
.
_list1.ItemsSource = new ListCollectionView(ints);
_list2.ItemsSource = new ListCollectionView(ints);
Также обратите внимание, что после этого вышеприведенные 3 сравнения выглядят как ложные