应该绑DataGrid一个
ICollectionView = CollectionViewSource.GetDefaultView(collection)
或者
ObservableCollection<T> collection; ???
MVVM的最佳实践是什么?为什么?
任何人都可以帮我正确实现ICollectionViewLiveShaping过滤目的吗?关于这个问题,我没有在网上找到很多有用的文档.这就是我所拥有的:
public ICollectionView WorkersEmployed { get; set; }
WorkersEmployed = new CollectionViewSource { Source = GameContainer.Game.Workers }.View;
Run Code Online (Sandbox Code Playgroud)
我没有使用,GetDefaultView因为我需要在此集合上有多个过滤器实例.如果重要,那GameContainer.Game.Workers就是ObservableCollection.
ApplyFilter(WorkersEmployed);
private void ApplyFilter(ICollectionView collectionView)
{
collectionView.Filter = IsWorkerEmployed;
}
public bool IsWorkerEmployed(object item)
{
Worker w = item as Worker;
return w.EmployerID == this.ID;
}
Run Code Online (Sandbox Code Playgroud)
这一切都有效,但当然必须手动刷新,这就是我尝试使用的原因ICollectionViewLiveShaping.我能找到的最好的例子就是这个,但不幸的是我仍然无法让它发挥作用.鉴于我在这里有什么,任何人都可以给我一个正确的方向,让实时过滤工作?
任何帮助将不胜感激.
出于好奇,这真的是一项艰巨的任务吗?如果是这样的话,设计人员似乎ICollectionViewLiveShaping做得很糟糕.
更新:看来,只有这样,才能增加一个属性LiveFilteringProperties的ICollectionViewLiveShaping通过字符串收集.鉴于这种限制,是否可以按另一个类中的属性进行过滤(在本例中为Workers'EmployerID)?
任何有经验的人都能GetDefaultView告诉我,在这种情况下我想做什么甚至是一个可行的选择吗?老实说我不知道是不是因为缺乏文档和可用的例子.即使这是不可行的,也至少知道我是否在浪费时间.
我有一个绑定到CollectionViewSource的WPF ListView.它的源绑定到一个属性,如果用户选择一个选项,该属性可能会更改.
当列表视图源由于属性更改事件而更新时,所有内容都会正确更新,但视图不会刷新以考虑CollectionViewSource过滤器中的任何更改.
如果我将一个处理程序附加到Source属性绑定的Changed事件,我可以刷新视图,但这仍然是旧视图,因为绑定尚未更新列表.
有什么好的方法可以在源更改时刷新视图并重新评估过滤器?
干杯
我正在尝试设置一个ListBox,从CollectionViewSource获取它的数据.我想要发生的是,当我更新底层数据源时,ListBox也会更新.我的Xaml看起来像这样......
<Window.Resources>
<ObjectDataProvider x:Key="AppTests" ObjectType="{x:Type Application:AppTestProvider}" MethodName="GetAppTests" />
<CollectionViewSource x:Key="cvs" Source="{StaticResource AppTests}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Priority" Direction="Ascending" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Window.Resources>
<Grid>
<ListBox x:Name="TestList" ItemsSource="{Binding Source={StaticResource cvs}}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TestName}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
Run Code Online (Sandbox Code Playgroud)
这显示数据正常,但如果我更改基础数据,那么在我cvs.View.Refresh()在后面的代码中调用方法之前,更改不会出现在网格上.
如何让这个"可观察",以便自动发生变化?
注意:使用CVS的原因是基于底层对象中的属性为列表提供排序.