C# 无法按具有多重绑定和转换器的列进行排序

C# 无法按具有多重绑定和转换器的列进行排序,c#,wpf,xaml,datagridview,datagrid,C#,Wpf,Xaml,Datagridview,Datagrid,我注意到,当我的列绑定到VM中的一个字段时,一切都正常,排序工作也如期进行。然而,由于客户提出了一个奇怪的要求,当另一列的状态发生变化时,我需要使用多重绑定和转换器来返回不同的值。所以我就这样结束了 <DataGridTextColumn Header="Original"> <DataGridTextColumn.Binding> <MultiBinding Converter="{StaticResource OriginalConverter}"&

我注意到,当我的列绑定到VM中的一个字段时,一切都正常,排序工作也如期进行。然而,由于客户提出了一个奇怪的要求,当另一列的状态发生变化时,我需要使用多重绑定和转换器来返回不同的值。所以我就这样结束了

<DataGridTextColumn Header="Original">
  <DataGridTextColumn.Binding>
    <MultiBinding Converter="{StaticResource OriginalConverter}">
      <Binding Path="Status.Id" />
      <Binding Path="Original" />
      <Binding Path="Substitution" />
    </MultiBinding>
  </DataGridTextColumn.Binding>
  <DataGridTextColumn.ElementStyle>
    ...
  </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

...
我不知道如何对该列进行排序。关闭转换器是不可能的,因为这是电网的主要功能之一。我正在我的数据网格组件中使用集合视图源(如果相关的话)。转换器本身如下所示

public class OriginConverter : IMultiValueConverter
{
  public object Convert(Object[] values, Type type, object param, CultureInfo culture)
  {
    int status = (int) values[0];
    int original = ...;
    int substitution = ...;
    return status < 3 ? original : substitution;
  }
}
public类OriginConverter:IMultiValueConverter
{
公共对象转换(对象[]值、类型类型、对象参数、文化信息文化)
{
int status=(int)值[0];
int原始=。。。;
整数替换=。。。;
返回状态<3?原始:替换;
}
}
或者在使用转换器时,排序不可用?听起来不太可能


我发现,这实际上起了一点作用,因为列得到了与排序列相伴的三角形,但是排序需要与显示的值相关,例如,converter提供的一个,在他的示例中,它被固定到一个绑定属性。

SortMemberPath可以帮助您

<DataGridTextColumn Header="Original" SortMemberPath="SortParam">
  <DataGridTextColumn.Binding>
    <MultiBinding Converter="{StaticResource OriginalConverter}">
      <Binding Path="Status.Id" />
      <Binding Path="Original" />
      <Binding Path="Substitution" />
    </MultiBinding>
  </DataGridTextColumn.Binding>
  <DataGridTextColumn.ElementStyle>
    ...
  </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
备注:SortMemberPath仅适用于属性,因此您最好在模型中有一个计算属性,sad


如果模型是自动生成的(EF、nHybernate或其他OCR映射器),或者如果不允许对模型进行更改(无法访问源代码),程序员可以使用分部类将所需的额外属性附着到原始模型上,不需要对T4文件的转换进行任何继承或修改。

您需要向转换器添加
ConvertBack()
方法,以获取
DataGridColumn
的新值集。然后在此基础上对其进行排序。@AbinMathew以及如何使网格实际回调?现在根本没有人叫它。另外,我有点惊讶,转换回将是一个问题,因为我希望得到的排序是基于转换到的值和我们转换的原始值的字母顺序。请解释。无需调用
ConvertBack()
在ViewModel中检索值时,将调用
ConvertBack()
。在
ConvertBack()。因此,该集合将保存您的新值,您可以根据字母表对集合进行排序。@如果我不清楚,请原谅。我从以前开始使用ConvertBack()方法。它只实现为throw new NotImplementedException()。这个异常不会被抛出,永远不会,现在。所以我想知道我应该如何让程序调用回转换。现在看来我可以归还任何东西,因为实际的归还没有发生……确实如此。链接答案中的那个家伙也是这么做的。它确实有帮助,因为现在当我点击一列时,我得到了排序三角形标记。但是,这是我需要解决的问题,我不需要像您的示例中那样按Status.Id排序。我想根据转换器返回的值进行排序,这些值是从原始状态值和替换状态值中获取的。我想将成员路径设置为OriginalConverter的值。我该怎么做?我已经用你的建议更新了你的答案。请给我几分钟的时间在VS中试用,我们很快就会完成最终版本的真正代码。我发现它不起作用哈哈…SortMemberPath中的多重绑定我也看到了。我不得不从第一次出现时删除SortMemberPath,然后三角形再次消失。那么,我们如何绑定(或其他)该属性呢?它是可行的吗?它只接受属性,所以在您的视图模型中,您可以添加一个具有逻辑的公共属性,就像get中的转换器一样。