2012-04-22 21 views
0

のは、私は次のようにドメインモデルを持っているとしましょう:私はこのようなデータグリッドにバインドUserListと呼ばれるこれらのObservableCollectionを、持っているWPF MVVMでプロキシオブジェクトなし派生プロパティにバインド

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 
} 

<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オブジェクトのそのような派生「プロパティ」にバインドする方法?

きれいで明白な解決方法は拡張方法ですが、明らかにその方法にバインドすることはできません。

グリッドにはこの列のを渡したいと思っています。私はUserと、これが何であるかを示すいくつかのキー(例: "fullname")を渡して、使用するデータを渡します列のために。

答えて

4

あなたは確かにこのようなマルチバインディングによって、それらの派生プロパティのほとんどを作成することができます。あなたはユーザーオブジェクトに直接結合すると、コンバータのパラメータでbinding converterを使用する必要があります、より複雑なものについては

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

をそれは、派生値を作成します。

<DataGridTextColumn Header="FullName" 
    Binding="{Binding Converter={StaticResource UserConverter}, ConverterParameter=FullName}"/> 

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

は次のように結合します

+0

'MultiBinding StringFormat'は、私の実際の場合(文字列の書式以上です)ではなく、私の例の場合には完璧です。しかし、IValueConverterは、医師が注文したものとまったく同じです。 :) WPFのプログラマーはおそらくすでに知っているだろうが、私はよく知られていないコードベースで混乱している。私はそれが存在しなければならないようなものを考え出したが、それがどのように見えるかはわからなかった。私のグーグルグーグルでは、私は 'IValueConverter'に導かれましたが、バインディング文字列がありませんでした。ありがとう。 :) – Mud

関連する問題