2

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

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

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 属性,或者处理 DataGrid 上的 Sorting 事件。

有一个解决方案建议修改视图模型以具有类似于以下内容的属性:

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();
    }
}
4

1 回答 1

3

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

SortMemberPath="FirstString"

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

public string Converted { get; set; }与您想要摆脱的并没有太大的不同,因此对您来说可能没有太大的价值。我只是说那是我会尝试的。

于 2012-05-08T19:33:30.837 回答