2017-02-27 127 views
0

我有3个datagrid列绑定到不同的转换器,它将对象字段转换为字符串。使WPF datagrid列绑定到转换器可排序

现在使用CollectionView进行排序如何制作使用转换器可排序的列?

我使用实体框架数据库第一,所以我想我不能添加一个DependencyProperty到数据网格中显示字段的对象。 同时向数据库中的对象添加更多字段是没有选择的。

这是否有一个优雅的解决方案?

XAML示例代码:

<DataGridTextColumn Width="200" Header="Status" SortMemberPath="myPath"> 
    <DataGridTextColumn.Binding> 
     <Binding Converter="{StaticResource fieldsToStringConverter}"/> 
    </DataGridTextColumn.Binding> 
</DataGridTextColumn> 

至于C#我有只为正常(非转换器)的列处理过滤和排序,但目前排序的CollectionView:

ICollectionView datagridView = CollectionViewSource.GetDefaultView(myDataGrid.ItemsSource); 
+0

显示你的方法或一些代码片段 –

+0

完成。我想不出任何后续值得的代码。 – user2586856

+0

在所有生成的类都是“partial”之后,仍然可以向模型类中添加非数据库(可能只读)属性? – grek40

回答

0

的溶液I具有我选择的是:

我使用DataGrid的Sorting事件来检查哪个列被排序。 如果单击使用转换器的列,我保存当前的排序方向并重新分配由创建新的CollectionView的转换器排序的DataGrid.Itemssource。然后将点击列的排序方向设置为保存的排序方向。

如果将元素添加到数据库或从数据库中删除元素,此功能也可以很好地工作,因为如果当前排序位于使用转换器的其中一列上,则可以使用排序事件函数作为刷新。为了清楚起见,这涉及一些不在下面的例子中的附加代码。

XAML

<DataGrid x:Name="dataGrid" ... Sorting="dataGrid_Sorting"> 

...

<DataGridTextColumn Width="200" Header="Status" SortMemberPath="mySortMemberPath"> 
    <DataGridTextColumn.Binding> 
     <Binding Converter="{StaticResource myConverter}"/> 
    </DataGridTextColumn.Binding>  
</DataGridTextColumn> 

C#

private void dataGrid_Sorting(object sender, DataGridSortingEventArgs e) 
     { 
      string sortMemberPath = e.Column.SortMemberPath; 
      if (sortMemberPath == null || sortMemberPath == "") 
      { 
       return; 
      } 
      IValueConverter converter = null; 
      switch (sortMemberPath) 
      { 
       case "mySortMemberPath": 
        converter = new myConverter(); 
        break; 
      } 
      if (converter != null) 
      { 
       e.Handled = true; 
       ListSortDirection direction = (e.Column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending; 
       if (direction == ListSortDirection.Ascending) 
       { 
        dataGrid.ItemsSource = --sort my list with converter-- 
       } 
       else 
       { 
        dataGrid.ItemsSource = --sort my list with converter-- 
       } 
       datagridView = CollectionViewSource.GetDefaultView(dataGrid.ItemsSource); 
       e.Column.SortDirection = direction; 
       applyCollectionViewFilter(); 
      } 
     }