我注意到当我的列绑定到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,它实际上有点工作,因为该列获得了与排序列相关的三角形,但排序需要与显示值,即转换器提供的值,在他的示例中,它固定为一个绑定属性。
答案 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文件的转换。