3

目前我有以下内容:

<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 中,直到它被刷新。

我发现了与此类似的问题,例如https://stackoverflow.com/a/5407354/181771使用MultiBinding但它适用于 aTextBlock而不是 a DataGrid

我还有其他方法可以让这个工作吗?

4

2 回答 2

5

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

例如。

<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>
于 2012-06-07T18:45:37.297 回答
2

FullName您应该从Forename和发出属性更改通知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");
        }
    }
}
于 2012-06-07T15:45:27.713 回答