質問: データがコンバーターから取得された列でデータグリッドを並べ替えるにはどうすればよいですか?
次のようなビュー モデルがあります。
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 の制限がビュー モデル レイヤーに流れ込んでいるように感じます。
更新:これがコンバーターです
[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();
}
}