目前我有以下内容:
<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); }
}
绑定有效,但不理想。
如果有人更新Forename
或Surname
属性,则在刷新之前,更新不会反映在DataGrid中。
我发现类似的问题,例如使用MultiBinding
的{{3}},但这适用于TextBlock
而不是DataGrid
。
我还有另一种方式可以让它发挥作用吗?
答案 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)
您应该从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");
}
}
}