在有界数据发生更改后重新排序WPF DataGrid

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)

然后在应用程序的视图部分你没有事情做,因为绑定ItemsSourceCollectionControl到的视图属性CollectionViewSource直接而不是到ObservableCollection:

<DataGrid ItemsSource="{Binding ViewSource.View}" />
Run Code Online (Sandbox Code Playgroud)

从这一点开始,您可以使用CollectionViewSourceViewModel中的对象直接操作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中配置它会更容易.

  • 谢谢!这有帮助.我只是很难搞清楚scm命名空间.这里是人们试图找到它:xmlns:scm ="clr-namespace:System.ComponentModel; assembly = WindowsBase" (5认同)
  • 这个链接已经死了,但我在[互联网档案馆]上找到了这个文字.(https://web.archive.org/web/20150103043436/http://www.zagstudio.com/blog/387#.VwVFQfkrKUk) (4认同)

Ant*_*ols 6

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)