2012-05-08 4 views
2

質問:データを変換元から取得した列のデータグリッドをソートするにはどうすればよいですか?コンバータからのデータにWPFデータグリッドをソートする方法は?

私は似ているビューモデルがあります:

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

をさらにし、私はちょうどstringIEnumerable<string>をマップするカスタムコンバータを内蔵しています。

私のデータグリッドは次のようになります。

<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でSortingイベント を処理する可能性のある解決策は です。より良い以上の標準的なアプローチがあれば、私は思ったんだけど...

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

しかし:

はに似ている性質を持つようにビューモデルを変更することを提案することを中心に浮動解決策ありますこれを解決するまでこのソリューションのように、View ModelレイヤーにUIの制限があります。

UPDATEは:ここにこれがテストされていないコンバータ

[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

だがコメントにあなたが離れていないので、おそらくから取得したいpublic string Converted { get; set; }とは異なる

SortMemberPath="FirstString" 

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

ない全体の多くをフォーマットすることはできませんあなたに多くの価値があります。私はそれが私が試みるものだと言っていました。

+0

私は、ビューモデルをXAMLおよびコンバータとは別のアセンブリに持っています。このアプローチでは、ビューモデルレイヤーに変換を効果的に移動する必要がありますか? – jglouie

関連する問題