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称为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并重写大量代码来处理此代理、将状态从域对象复制到代理对象等?

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

我只是想告诉网格:对于这个列,给我一个用户和一些指示这是什么的键(例如“全名”),我会将数据传回给你用于该列。

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 回答