是否可以将2个属性绑定到单个DataGrid字段中?

时间:2012-06-07 15:05:03

标签: c# wpf xaml binding

目前我有以下内容:

<DataGridTextColumn Header="Customer Name" 
    x:Name="columnCustomerSurname" 
    Binding="{Binding Path=Customer.FullName}" SortMemberPath="Customer.Surname"
    IsReadOnly="True">
</DataGridTextColumn>

其中Customer.FullName定义为:

public string FullName
{
    get { return string.Format("{0} {1}", this.Forename, this.Surname); }
}

绑定有效,但不理想。

如果有人更新ForenameSurname属性,则在刷新之前,更新不会反映在DataGrid中。

我发现类似的问题,例如使用MultiBinding的{​​{3}},但这适用于TextBlock而不是DataGrid

我还有另一种方式可以让它发挥作用吗?

2 个答案:

答案 0 :(得分:4)

一种选择是基于两个文本块创建复合模板列,这些文本块仍然允许在对任一属性进行更改时更新表单。

例如

<DataGridTemplateColumn Header="Customer Name">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Customer.ForeName}"/>
                <TextBlock Text="{Binding Path=Customer.SurName}"/>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

答案 1 :(得分:2)

您应该从FullNameForename提出Surname的财产更改通知,例如

public string Forename
{
    get{ return _forename; }
    set
    {
        if(value != _forename)
        {
            _forename = value;
            RaisePropertyChanged("Forename");
            RaisePropertyChanged("Fullname");
        }
    }
}

或者,您像这样缓存生成的FullName值

public string Forename
{
    get{ return _forename; }
    set
    {
        if(value != _forename)
        {
            _forename = value;
            RaisePropertyChanged("Forename");
            UpdateFullName();
        }
    }
}

private void UpdateFullName()
{  
    FullName = string.Format("{0} {1}", this.Forename, this.Surname); 
}

public string FullName
{
    get{ return _fullname; }
    private set
    {
        if(value != _fullname)
        {
            _fullname = value;
            RaisePropertyChanged("FullName");
        }
    }
}