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

时间:2015-08-17 19:00:42

标签: c# wpf xaml datagridview datagrid

我注意到当我的列绑定到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;
  }
}

或者在使用转换器时排序不可用?听起来不太可能......

我找到了this hint,它实际上有点工作,因为该列获得了与排序列相关的三角形,但排序需要与显示值,即转换器提供的值,在他的示例中,它固定为一个绑定属性。

1 个答案:

答案 0 :(得分:2)

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>
public int SortParam
{
  get
  { 
    return (bool)(new OriginalConverter())
      .Convert(new object[] { Status.Id, Original, Substitution }, typeof(int), null, null); 
  }
}

备注:SortMemberPath仅适用于属性,因此最好在模型中使用计算属性,这很难过

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