gpt4 book ai didi

c# - 如何获取在 XAML 中定义的 CollectionView

转载 作者:太空狗 更新时间:2023-10-29 18:23:02 27 4
gpt4 key购买 nike

我想绑定(bind)到 XAML 中的 ObservableCollection 并在那里应用分组。原则上,这工作正常。

<UserControl.Resources>
<CollectionViewSource x:Key="cvs" Source="{Binding Path=TestTemplates}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Title"/>
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="TestCategory"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</UserControl.Resources>

然后数据绑定(bind)表达式变成了 ItemsSource="{Binding Source={StaticResource ResourceKey=cvs}}" 而不是 ItemsSource="{Binding Path=TestTemplates}" .

起初,一切看起来都很酷,直到我想从 View 模型刷新 UI。问题是,CollectionViewSource.GetDefaultView(TestTemplates) 返回的 View 与应用分组的 XAML 中的 View 不同。因此,我无法设置选择或使用它做任何有用的事情。

我可以通过再次将列表直接绑定(bind)到 View 模型的属性并在代码隐藏中设置分组来修复它。但我对这个解决方案不太满意。

private void UserControlLoaded(object sender, RoutedEventArgs e)
{
IEnumerable source = TemplateList.ItemsSource;
var cvs = (CollectionView)CollectionViewSource.GetDefaultView(source);
if (cvs != null)
{
cvs.SortDescriptions.Add(new SortDescription("Title", ListSortDirection.Ascending));
cvs.GroupDescriptions.Add(new PropertyGroupDescription("TestCategory"));
}
}

我想,原因已经是 given by John Skeet here .

不过,我希望应该有一种方法来获得正确的 View 。我错了吗?

最佳答案

我倾向于只从 VM 公开 Collection View ,而不是让 View 定义它:

public ICollection<Employee> Employees
{
get { ... }
}

public ICollectionView EmployeesView
{
get { ... }
}

这样您的 VM 就可以完全控制向 View 公开的内容。例如,它可以更改排序顺序以响应某些用户操作。

关于c# - 如何获取在 XAML 中定义的 CollectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11046618/

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