mar*_*man 28 c# data-binding wpf datagrid collectionviewsource
我正在寻找一种方式来重新梳理我DataGrid
当基础数据已经改变.
(设置非常标准:DataGrid的ItemSource
属性绑定到ObservableCollection
;列是DataGridTextColumns
; DataGrid内的数据对ObservableCollection内部的更改做出正确反应;使用鼠标单击时排序工作正常)
有任何想法吗 ?
mar*_*man 29
我花了整个下午,但我终于找到了一个解决方案是出奇的简单,短期和高效:
要控制所讨论的UI控件的行为(这里是a DataGrid
),可以简单地使用a CollectionViewSource
.它可以作为ViewModel中UI控件的一种代表,而不会完全破坏MVMM模式.
在视图模型声明既CollectionViewSource
和普通ObservableCollection<T>
和包裹CollectionViewSource
周围的ObservableCollection
:
// Gets or sets the CollectionViewSource
public CollectionViewSource ViewSource { get; set; }
// Gets or sets the ObservableCollection
public ObservableCollection<T> Collection { get; set; }
// Instantiates the objets.
public ViewModel () {
this.Collection = new ObservableCollection<T>();
this.ViewSource = new CollectionViewSource();
ViewSource.Source = this.Collection;
}
Run Code Online (Sandbox Code Playgroud)
然后在应用程序的视图部分你没有事情做,因为绑定ItemsSource
的CollectionControl
到的视图属性CollectionViewSource
直接而不是到ObservableCollection
:
<DataGrid ItemsSource="{Binding ViewSource.View}" />
Run Code Online (Sandbox Code Playgroud)
从这一点开始,您可以使用CollectionViewSource
ViewModel中的对象直接操作View中的UI控件.
例如排序 - 这是我的主要问题 - 看起来像这样:
// Specify a sorting criteria for a particular column
ViewSource.SortDescriptions.Add(new SortDescription ("columnName", ListSortDirection.Ascending));
// Let the UI control refresh in order for changes to take place.
ViewSource.View.Refresh();
Run Code Online (Sandbox Code Playgroud)
你看,非常非常简单和直观.希望这有助于其他人喜欢它帮助我.
sel*_*dog 19
这更像是一个澄清而不是一个答案,但WPF 总是绑定到一个ICollectionView
而不是源集合.CollectionViewSource
只是一种用于创建/检索集合视图的机制.
以下是有关该主题的优秀资源,可帮助您更好地利用WPF中的集合视图:http://bea.stollnitz.com/blog/? p = 387
CollectionViewSource
在XAML中使用实际上可以简化您的代码:
<Window.Resources>
<CollectionViewSource Source="{Binding MySourceCollection}" x:Key="cvs">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="ColumnName" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Window.Resources>
...
<DataGrid ItemsSource="{Binding Source={StaticResource cvs}}">
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
有些人认为,在遵循MVVM模式时,视图模型应该始终公开集合视图,但在我看来,它只取决于用例.如果视图模型永远不会直接与集合视图交互,那么在XAML中配置它会更容易.
sellmeadog 的答案要么过于复杂,要么已经过时。这非常简单。您所要做的就是:
<UserControl.Resources>
<CollectionViewSource
Source="{Binding MyCollection}"
IsLiveSortingRequested="True"
x:Key="MyKey" />
</UserControl.Resources>
<DataGrid ItemsSource="{Binding Source={StaticResource MyKey} }" >...
Run Code Online (Sandbox Code Playgroud)