簡體   English   中英

使綁定到轉換器的WPF datagrid列可排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM