我有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);
答案 0 :(得分:0)
我为我选择的解决方案是:
我使用DataGrid的Sorting事件来检查哪个列已排序。 如果单击使用转换器的列,则保存当前排序方向并重新分配由转换器排序的DataGrid.Itemssource,该转换器将创建新的CollectionView。然后将单击列的排序方向设置为已保存的排序方向。
如果在数据库中添加或删除元素,这也很有用,因为如果当前排序使用转换器在其中一个列上,我可以使用排序事件函数作为刷新。为了清楚起见,这涉及一些不在下面的例子中的附加代码。
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();
}
}