使WPF datagrid列绑定到转换器可排序

时间:2017-02-27 21:33:37

标签: c# wpf wpfdatagrid

我有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);

1 个答案:

答案 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();
            }
        }