【发布时间】:2013-04-01 17:39:34
【问题描述】:
我有一个 WPF 窗口,其中包含我希望绑定到我的模型的控件。模型实现 INotifyPropertyChanged 以在 Properties 更改值时通知视图。属性是由字段支持的原语,例如:
private bool m_isRunning;
public bool IsRunning
{
get { return m_isRunning; }
private set
{
m_isRunning= value;
OnPropertyChanged("IsRunning");
}
}
protected virtual void OnPropertyChanged(string propertyName)
{
if (String.IsNullOrEmpty(propertyName))
{
return;
}
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
这适用于原始值。我还有一个具有各种原始属性和哈希表的复合对象。或者,我想绑定到 ObservableCollection 的 Count 属性。我想将我的视图控件绑定到复合对象中的属性,但我认为这是不可能的。比如:
<Run Text="{Binding Path=CompositeObject.SomeInnerProperty, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
这似乎是不可能的,但还有其他方法吗?我觉得我唯一的选择是公开映射到复合对象内部属性的属性,但这似乎有很多重复,例如:
public bool SomeInnerProperty
{
get { return m_myComposite.SomeInnerProperty; }
private set
{
m_myComposite.SomeInnerProperty= value;
OnPropertyChanged("SomeInnerProperty");
}
}
【问题讨论】:
-
复合对象是否(或可以)实现 INotifyPropertyChanged?
-
可以,是的。我实际上正在查看此内容,您显然可以绑定到属性的属性。如果虚拟机能够通知复合对象的变化,我认为它会起作用。 nbdtech.com/Free/WpfBinding.pdf
-
绑定到
CompositeObject.SomeInnerProperty之类的东西没有问题,但是如果CompositeObject没有实现INotifyPropertyChanged,那么当SomeInnerProperty更改时,您的UI 将不会更新。另外,请注意,您只能绑定到属性(使用get和set方法),而不是字段。关于重复代码,我个人使用一些 Visual Studio macros 为我编写公共属性,所以如果你不想在CompositeObject上实现 INPC,也许你可以考虑做类似的事情。 -
@Rachel,这回答了我的问题。如果你把它放在答案中,我可以关闭它。谢谢。
-
@StealthRabbi 当然,它已添加 :)