DataBinding是否可能是复合对象的字段?

时间:2013-04-01 17:39:34

标签: wpf mvvm .net-4.0

我有一个带有控件的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");
    }
}

2 个答案:

答案 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类,并且我使所有类继承自该基类,并且数据绑定工作正常。

您有两种选择:

  1. 如果您的模型类没有实现INPC,那么就像您建议的那样在ViewModel中创建包装器属性,或者
  2. 在您的模型中实现INPC,只需在ViewModel中公开您的主对象,只要内部属性通知更改,您就可以根据需要进行绑定。