WPF DataGrid:自动对DataGridTemplateColumn进行重新排序

Joe*_*ein 6 c# wpf datagrid datagridtemplatecolumn

在WPF的DataGrid控件中,如果将列设置为其中一个默认列类型(如DataGridTextColumn或DataGridCheckBoxColumn),对该列进行排序,然后更改其值,网格将自动重新排序.

但是,如果使用DataGridTemplateColumn(并允许对列进行排序),则可以对其进行排序,但更改此列中单元格的值不会导致网格未重新排序.我如何诱导它自动触发重新排序?

XAML:

<DataGrid Name="grid" AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridTextColumn Header="First name" Binding="{Binding First}"/>
    <DataGridTemplateColumn Header="Last name" SortMemberPath="Last">
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <TextBox Text="{Binding Last}"/>
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
  </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

捆绑:

ObservableCollection items = new ObservableCollection();
grid.ItemsSource = items;
items.Add(new Character() { First = "Homer", Last = "Simpson" });
items.Add(new Character() { First = "Kent", Last = "Brockman" });
items.Add(new Character() { First = "Montgomery", Last = "Burns" });
Run Code Online (Sandbox Code Playgroud)

这是我的项目类,以防万一相关:

public class Character : INotifyPropertyChanged {
    private string first, last;
    public event PropertyChangedEventHandler PropertyChanged;
    private void Notify(string name) {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
    public string First { get { return first; } set { first = value; Notify("First"); } }
    public string Last { get { return last; } set { last = value; Notify("Last"); } }
}
Run Code Online (Sandbox Code Playgroud)

Kel*_*lly 6

我也在寻找这个问题的答案。我找到了一个解决方案:(对此不满意,但是......)

当您的收藏更新时,您可以执行以下操作:

SortDescription sortDescription = grdData.Items.SortDescriptions[0];
grdData.ItemsSource = null;
grdData.ItemsSource = Data;
grdData.Items.SortDescriptions.Add(sortDescription);
Run Code Online (Sandbox Code Playgroud)

丑陋但确实有效。您将需要存储整个集合,不像我的示例只存储第一项。

但它的一个问题是 DataGrid 丢失了指示排序的标题,因此尽管它正确地重新排序,但不再选择带有显示排序方向的箭头的列标题。