绑定到派生属性没有代理对象在WPF MVVM
问题描述:
比方说,我有一个域模型,如:绑定到派生属性没有代理对象在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
}
我对这些所谓的UserList
的ObservableCollection
,我绑定到这样一个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
创建代理类(又名视图模型),并重写大量代码以处理此代理,将域对象的状态复制到代理对象等。 ?
一个相当干净明显的解决方案将是一个扩展方法,但显然你不能绑定到那个。
我只是想能够告诉网格:这个专栏,给我一个用户和一些关键指示这是什么(例如“全名”),我会通过你回传数据以使用为列。
答
你当然可以创建最多的派生属性由多绑定像这样的:
<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}"/>
'MultiBinding StringFormat'非常适合我的示例,不适用于我的实际情况(这不仅仅是字符串格式),但这很好理解。但是,IValueConverter正是医生所订购的。 :) WPF程序员可能已经知道的东西,但我在一个陌生的代码库中混淆了。我觉得这样的东西一定存在,但不知道它会是什么样子。我昨天的搜索引擎导致了我'IValueConverter',但我错过了绑定字符串。谢谢。 :) – Mud 2012-04-22 21:59:35