[英]Make WPF datagrid column bound to converter sortable
我有3個datagrid列,它們綁定到不同的轉換器,這些轉換器將對象字段轉換為字符串。
現在使用CollectionView進行排序,如何使使用轉換器的列可排序?
我首先使用Entity Framework Database,所以我認為我無法向該數據網格中顯示字段的對象添加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);
我為我選擇的解決方案是:
我使用DataGrid的Sorting事件來檢查對哪一列進行了排序。 如果單擊使用轉換器的列,則保存當前的排序方向,然后重新分配由轉換器排序的DataGrid.Itemssource,這將創建一個新的CollectionView。 然后將單擊列的排序方向設置為保存的排序方向。
如果在數據庫中添加或刪除了元素,這也很好用,因為如果當前排序在使用轉換器的列之一上,則我可以僅使用sorting事件函數作為刷新。 為了清楚起見,這涉及一些未在以下示例中添加的代碼。
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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.