2012-04-22 55 views
0

比方说,我有一个域模型,如:绑定到派生属性没有代理对象在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 
} 

我对这些所谓的UserListObservableCollection,我绑定到这样一个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创建代理类(又名视图模型),并重写大量代码以处理此代理,将域对象的状态复制到代理对象等。 ?

一个相当干净明显的解决方案将是一个扩展方法,但显然你不能绑定到那个。

我只是想能够告诉网格:这个专栏,给我一个用户和一些关键指示这是什么(例如“全名”),我会通过你回传数据以使用为列。

回答

4

你当然可以创建最多的派生属性由多绑定像这样的:

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

对于更复杂的东西,你可能需要直接绑定到用户对象和使用binding converter与转换器参数创建该导出的值:

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}"/> 
+0

'MultiBinding StringFormat'非常适合我的示例,不适用于我的实际情况(这不仅仅是字符串格式),但这很好理解。但是,IValueConverter正是医生所订购的。 :) WPF程序员可能已经知道的东西,但我在一个陌生的代码库中混淆了。我觉得这样的东西一定存在,但不知道它会是什么样子。我昨天的搜索引擎导致了我'IValueConverter',但我错过了绑定字符串。谢谢。 :) – Mud 2012-04-22 21:59:35