2017-02-27 123 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(); 
      } 
     }