0

私が次のようなドメインモデルを持っているとしましょう:

class User  {
    public string FirstName  { get; set; }
    public string LastName   { get; set; }
    public string MiddleName { get; set; }
    public int    Age        { get; set; }
    // tons of other stuff
}

私はObservableCollectionこれらのうちの1つを持ってUserListいます。これを次のようにDataGridにバインドします。

<dg:DataGrid ItemsSource="{Binding Path=UserList}" SelectedIndex="{Binding Path=Selecteduser}">
    <dg:DataGrid.Columns>
        <dg:DataGridTextColumn Header="Name" Binding="{Binding Path=FirstName, Mode=OneWay}" />
        <dg:DataGridTextColumn Header="Age" Binding="{Binding Path=Age, Mode=OneWay}" />
    </dg:DataGrid.Columns>
</dg:DataGrid>

次に、ユーザーのフルネームのグリッド列を追加することにしました。私のUserオブジェクトにはこのプロパティがありませんが、オブジェクトを渡せば簡単に計算できUserます。Userこのプロキシを処理するためのプロキシクラス(ビューモデル)を作成したり、User大量のコードを書き換えたり、ドメインオブジェクトからプロキシオブジェクトに状態をコピーしたりせずに、オブジェクトのこのような派生「プロパティ」にバインドするにはどうすればよいですか?

かなりクリーンで明白な解決策は拡張メソッドですが、どうやらそれにバインドすることはできません。

グリッドに伝えたいだけです。この列には、ユーザーと、これが何のためにあるかを示すキー( "fullname"など)を渡してください。列に使用するデータを返します。

4

1 に答える 1

4

次のようなマルチバインディングによって、これらの派生プロパティのほとんどを確実に作成できます。

<DataGridTextColumn Header="FullName">
    <DataGridTextColumn.Binding>
        <MultiBinding StringFormat="{}{0} {1}}">
            <Binding Path="FirstName"/>
            <Binding Path="LastName"/>
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

より複雑なものについては、Userオブジェクトに直接バインドし、派生値を作成するコンバーターパラメーターでバインディングコンバーターを使用する必要がある場合があります。

public class UserConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        User user = (User)value;
        string result = string.Empty;

        switch ((string)parameter)
        {
            case "FullName":
                result = string.Format("{0} {1}", user.FirstName, user.LastName);
                break;
        }

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

次に、次のようにバインドします。

<DataGridTextColumn Header="FullName"
    Binding="{Binding Converter={StaticResource UserConverter}, ConverterParameter=FullName}"/>
于 2012-04-22T19:57:30.600 に答える