如何对来自转换器的数据进行WPF数据网格排序?

时间:2012-05-08 17:34:14

标签: .net wpf

问题:如何对数据来自转换器的列进行数据网格排序?

我有一个类似的视图模型:

public class MyViewModel
{
    public string Name { get; set; }
    public IEnumerable<string> Aliases { get; set; }
}

此外,我有一个自定义转换器,可将IEnumerable<string>映射到string

我的DataGrid类似于:

<DataGrid ItemsSource="...">
    <DataGrid.Columns>
        <DataGridTextColumn Width="10" Header="..." Binding="{Binding Path=Name}" />
        <DataGridTextColumn Width="10" Header="..." Binding="{Binding Path=Aliases, Converter={StaticResource myConverter}}" />
     ...

到目前为止,这么好。它按预期显示。问题在于排序。

按名称排序时,一切都很好。当按数据来自转换器的列进行排序时,我得到一个.NET异常:

  

添加的SortDescriptions无效。可能的解决方案是   将Column上的CanUserSort设置为false或使用   Column上的SortMemberPath属性,或处理Sorting事件   在DataGrid上。

有一个解决方案浮动,建议修改视图模型以具有类似于:

的属性
public class AliasesMapping
{
    public IEnumerable<string> Raw { get; set; }
    public string Converted { get; set; }
}

但是......我想知道是否有更好或更标准的方法来解决这个问题。感觉就像在这个解决方案中,UI限制正在流入View Model层。

更新:这是转换器

[ValueConversion(typeof(IEnumerable<string>), typeof(string))]
public class AliasFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string converted = string.Empty;
        var val = value as IEnumerable<string>;

        if (val != null)
        {
            var list = new List<string>(val);
            list.Sort();

            converted = string.Join(",", list);
        }

        return converted;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

1 个答案:

答案 0 :(得分:3)

这未经过测试,但无法格式化评论

SortMemberPath="FirstString"

Public string FirtString { get { return Aliases[0]; } }

与你想要离开的public string Converted { get; set; }并没有很大的不同,所以对你来说可能没什么价值。我只是说这就是我想要的。