问题:如何对数据来自转换器的列进行数据网格排序?
我有一个类似的视图模型:
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();
}
}
答案 0 :(得分:3)
这未经过测试,但无法格式化评论
SortMemberPath="FirstString"
Public string FirtString { get { return Aliases[0]; } }
与你想要离开的public string Converted { get; set; }
并没有很大的不同,所以对你来说可能没什么价值。我只是说这就是我想要的。