【问题标题】:Is DataBinding to a composite object's fields possible?可以对复合对象的字段进行数据绑定吗?
【发布时间】: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 将不会更新。另外,请注意,您只能绑定到属性(使用 getset 方法),而不是字段。关于重复代码,我个人使用一些 Visual Studio macros 为我编写公共属性,所以如果你不想在 CompositeObject 上实现 INPC,也许你可以考虑做类似的事情。
  • @Rachel,这回答了我的问题。如果你把它放在答案中,我可以关闭它。谢谢。
  • @StealthRabbi 当然,它已添加 :)

标签: wpf mvvm .net-4.0


【解决方案1】:

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

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

关于处理重复代码,我个人使用一些Visual Studio macros 来为我编写我的公共属性,所以如果你不想在你的@987654330 上实现INotifyPropertyChanged,也许你可以考虑做类似的事情@ 班级。应该注意的是,宏已从 Visual Studio 2012 中删除,因此如果您有较新的版本,您可能需要使用其他替代方法,例如 creating an add-in to run your macros

【讨论】:

  • 是否可以绑定到哈希表中的值,例如:绑定路径=MyDerpHash[5]。我认为,即使这是可能的,该观点也在对可能违反 MVVM 的数据做出很大的假设。
  • @StealthRabbi 您应该能够提供这是一个有效的属性。以前,我每隔一段时间就使用这种语法绑定到 List 或 Array 中的第一项。视图是 UI 的反映,所以我认为如果 UI 偶尔需要对它背后的数据层做出这种假设是很好的。
【解决方案2】:

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

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

你有两个选择:

  1. 如果您的模型类未实现 INPC,请按照您的建议在 ViewModel 中创建包装器属性,或者
  2. 在您的模型中实现 INPC 并在 ViewModel 中公开您的主要对象,只要内部属性通知更改,您就可以绑定任意深度。

【讨论】:

  • 我没有遇到 INPC 冲突,只是想弄清楚是否可以绑定到内部属性。
  • 这意味着您没有办法修改您的复合对象定义以使其实现 INPC 或从实现它的基类继承并仅通知更改?
  • 据我了解,WPF 中要求您绑定的每个属性都通知更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
相关资源
最近更新 更多