【发布时间】:2017-05-22 10:16:05
【问题描述】:
我有这样的 XAML 代码
<Grid x:Name="MainGrid">
<TextBox Text="{Binding A, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding B, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding C, Mode=OneWay}" />
</Grid>
和带有 DataContext 类的 C# 代码
public class TableData : INotifyPropertyChanging, INotifyPropertyChanged
{
private Dictionary<string, object> SourceData = new Dictionary<string, object>() { { "A", (double)55 }, { "B", (double)44 } };
public double A { get { return (double)this["A"]; } set { this["A"] = value; } }
public double B { get { return (double)this["B"]; } set { this["B"] = value; } }
public double C { get { return this.A + this.B; } }
public object this[string key]
{
get
{
return this.SourceData[key];
}
set
{
OnPropertyChanging(Binding.IndexerName);
this.SourceData[key] = value;
OnPropertyChanged(Binding.IndexerName);
}
}
#region INotify
protected virtual event PropertyChangedEventHandler PropertyChanged;
event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
{
add { PropertyChanged += value; }
remove { PropertyChanged -= value; }
}
protected virtual event PropertyChangingEventHandler PropertyChanging;
event PropertyChangingEventHandler INotifyPropertyChanging.PropertyChanging
{
add { PropertyChanging += value; }
remove { PropertyChanging -= value; }
}
protected virtual void OnPropertyChanged(string Name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(Name));
}
protected virtual void OnPropertyChanging(string Name)
{
PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(Name));
}
#endregion
}
上面的代码在 DataGrid 上运行良好,但在 TextBox 上不行。问题是,当我在线更改 A 或 B 属性时,C 属性不会自行重新计算。 我不想使用此代码:
{绑定 [a]}
或像这样的私有财产
私有双 _A { 获取;放; }
私有双 A { 获取 { 返回 _A; } 设置 { A = 值; OnPropertyChanged("A") } }
因为我有包含数据的 SourceData 字典,并且我从其他代码中引用了属性 A - 如果有人键入错误代码,则警告有效。如果我使用 Binding [A],那就可以了,很好,但智能感知不起作用 - 显然。
有什么方法可以在不使用 OnPropertyChanged("C") 的情况下重新计算 C 属性?
【问题讨论】:
-
最初的问题是在编译时检测损坏的绑定吗?
-
是的,并不能防止程序员输入错误。
标签: c# wpf data-binding