gpt4 book ai didi

.net - Wpf ListBoxes' ItemsSource 奇怪的行为

转载 作者:行者123 更新时间:2023-12-04 17:03:48 25 4
gpt4 key购买 nike

已编辑 地址 F Ruffell's answer

我有以下 xaml

<StackPanel>
<ListBox x:Name="_list1"/>
<ListBox x:Name="_list2"/>
</StackPanel>

和这个代码隐藏:
var ints = new[] { 1, 2, 3 };
_list1.ItemsSource = ints;
_list2.ItemsSource = ints;

_list1.Items.Filter = i => ((int)i) < 2;

出于某种原因,仅对第一个 ListBox 设置过滤器后 两个列表都被过滤了 .我希望列表具有完全不同的 CollectionViews确实 _list1.Items != _list2.Items .同时将过滤器设置为其中一个也会以某种方式将该过滤器设置为另一个。
问题是 为什么怎么样CollectionViews同步?

最佳答案

当您设置 ItemsSource WPF 实际上创建了一个 CollectionView来自指定的 IEnumerable .它这样做是为了有一个被选择的项目(s),过滤,分组等的概念(这些都不被分配给 IEnumerableItemsSource 支持)。当同一个底层集合被多次使用时,WPF 会同步这两个 CollectionView。
如果您不想要这种行为,只需设置 IsSynchronizedWithCurrentItemFalse在每个 ListBox .

有关更多信息,请参阅:

WPF Combobox binding

编辑

经过进一步调查,似乎设置了 IsSynchronizedWithCurrentItem实际上仅适用于所选项目,以及两个 ICollectionViews 中的所有其他属性仍然是同步的(即使每个 ListBox 都有自己的 ICollectionView - 将 Filter 更改或将 SortDescription 添加到一个,将其添加到另一个,您每天都会学到新东西:))。

要更改此行为,您需要创建 ICollectionView每个ListBox自己再直接修改Filter属性,例如:

        var ints = new[] { 1, 2, 3 };
var viewOne = new ListCollectionView(ints);
var viewTwo = new ListCollectionView(ints);
_list1.ItemsSource = viewOne;
_list2.ItemsSource = viewTwo;

viewOne.Filter = i => ((int)i) < 2;

干杯!

关于.net - Wpf ListBoxes' ItemsSource 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7713688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com