2012-05-08 43 views
2

问题:如何对其数据来自转换器的列上的数据网格进行排序?如何对来自转换器的数据进行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无效。可能的解决方案是 将列上的CanUserSort设置为false,或在列上使用 SortMemberPath属性,或处理DataGrid上的排序事件 。

有浮动周围建议修改视图模型有一个属性,它类似于一个解决方案:

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

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

更新:这是这不是测试的转换器

[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

您是否尝试过设置SortMemberPath? – Tyrsius

+0

我试着将它设置为{Binding Path = Aliases,Converter = {StaticResource myConverter}} ..那是你的意思吗? – jglouie

+0

SorthMemberPath将是上下文中的路径,您不希望对其使用绑定。如果你设置'SortMemberPath = Length',会发生什么? – Tyrsius

回答

3

,但无法格式化评论

SortMemberPath="FirstString" 

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

不是一大堆比你想从这样可能不会走public string Converted { get; set; }不同对你很有价值。我只是说这就是我想要的。

+0

我有我的视图模型在与XAML和转换器分开的程序集中,所以使用这种方法时,我需要将转换有效地移动到视图模型层? – jglouie

相关问题