2

我有一个 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");
    }
}
4

2 回答 2

2

绑定到类似的东西没有任何问题CompositeObject.SomeInnerProperty,但是如果CompositeObject没有实现INotifyPropertyChanged,那么您的 UI 将不会收到更改通知,并且知道它需要在SomeInnerProperty更改时进行更新。

另外,请注意,您只能绑定到属性(使用 get 和 set 方法),而不能绑定到字段。所以你可以绑定public string SomeValue { get; set; }但你不能绑定到public string SomeValue;

关于处理重复代码,我个人使用一些Visual Studio 宏来为我编写我的公共属性,所以如果你不想INotifyPropertyChanged在你的CompositeObject类上实现,也许你可以考虑做类似的事情。应该注意的是,宏已从 Visual Studio 2012 中删除,因此如果您有较新的版本,您可能需要使用其他替代方法,例如创建加载项来运行宏

于 2013-04-01T18:49:42.340 回答
0

前段时间我遇到了同样的问题。看看我是怎么解决的: MVVM INotifyPropertyChanged conflict with base class PropertyChange

基本上,我创建了一个实现 INotifyPropertyChanged 的​​基类,并让我的所有类都从该基类继承,并且数据绑定工作正常。

你有两个选择:

  1. 如果您的模型类没有实现 INPC,则按照您的建议在 ViewModel 中创建包装器属性,或者
  2. 在您的模型中实现 INPC 并在 ViewModel 中公开您的主要对象,只要内部属性通知更改,您就可以绑定任意深度。
于 2013-04-01T17:50:06.943 回答