我有一个带有控件的WPF窗口我想绑定到我的模型。该模型实现INotifyPropertyChanged以在属性更改值时通知视图。属性是由字段支持的原语,例如:
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属性。我想将我的View控件绑定到复合对象中的属性,但我不认为这是可能的。类似的东西:
<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");
}
}
答案 0 :(得分:2)
绑定到CompositeObject.SomeInnerProperty
之类的内容没有任何问题,但是如果CompositeObject
没有实现INotifyPropertyChanged,那么您的用户界面将不会收到有关更改的通知,并且知道它需要SomeInnerProperty
更改时更新。
另请注意,您只能绑定到属性(使用get和set方法),而不能绑定到字段。因此,您可以绑定到public string SomeValue { get; set; }
,但无法绑定到public string SomeValue;
关于处理重复代码,我个人使用一些Visual Studio macros来为我编写我的公共属性,所以如果你不想实现INotifyPropertyChanged
,也许可以考虑做类似的事情在CompositeObject
课程上。应该注意的是,宏已从Visual Studio 2012中删除,因此如果您有更新的版本,则可能需要使用其他替代方法,如creating an add-in to run your macros
答案 1 :(得分:0)
我前段时间遇到同样的问题。看看我是如何解决它的: MVVM INotifyPropertyChanged conflict with base class PropertyChange
基本上我创建了一个实现了INotifyPropertyChanged的Base类,并且我使所有类继承自该基类,并且数据绑定工作正常。
您有两种选择: