2

質問: データがコンバーターから取得された列でデータグリッドを並べ替えるにはどうすればよいですか?

次のようなビュー モデルがあります。

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();
    }
}
4

1 に答える 1

3

これはテストされていませんが、コメントをフォーマットすることはできません

SortMemberPath="FirstString"

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

public string Converted { get; set; }あなたが逃げたいものと大差ないので、おそらくあなたにとってあまり価値はありません。私はそれが私が試みることだと言っていました。

于 2012-05-08T19:33:30.837 に答える