问题:如何在数据来自转换器的列上对数据网格进行排序?
我有一个类似于以下的视图模型:
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();
}
}