2013-02-28 76 views
3

假设您有一个具有属性的对象和一个绑定到该对象属性的控件。该对象发生更改时会发生什么?WPF:绑定到对象的属性;当对象改变时会发生什么?

例如,视图模型:

public class TheViewModel : INotifyPropertyChanged 
{ 
     private TheObjectClass theObject; 
     public TheObjectClass TheObject 
     { 
      get { return theObject; } 
      set { theObject = value; 
        OnPropertyChanged("TheObject"); } 
     } 
} 

该对象的类:

public class TheObjectClass : INotifyPropertyChanged 
{ 
     private ThePropertyClass theProperty; 
     public ThePropertyClass TheProperty 
     { 
      get { return theProperty; } 
      set { theProperty= value; 
        OnPropertyChanged("TheProperty"); } 
     } 
} 

该属性的类:

public class ThePropertyClass : INotifyPropertyChanged 
{ 
     private object objectToBindTo; 
     public object ObjectToBindTo 
     { 
      get { return objectToBindTo; } 
      set { objectToBindTo= value; 
        OnPropertyChanged("ObjectToBindTo"); } 
     } 
} 

,然后在窗口(已经视图模型设定为它是DataContext),你有一个绑定到这个对象的控件,如:

<TextBlock Text={Binding TheObject.TheProperty.ObjectToBindTo}/> 

然后你重置ViewModel.TheObject某处(绑定提出后):

ViewModel.TheObject = new TheObjectClass(); 

在我的测试(没有具体的代码,这是在代码的只是一个简单的例子我应用程序),似乎有时候绑定会存活,有时会停止工作。我应该在这里发生什么?对我来说,当父对象被实例化为一个不同的对象时,属性绑定会中断,但有时它似乎生存下来,这真的让我感到困惑。

回答

6

一般来说,这是一个受支持的操作,绑定应该始终“生存”。 WPF绑定系统会在TheObject上看到属性更改通知,并应将绑定重置为新的子对象。

实际上,绑定偶尔不会存活,但这通常是因为有一个时间点,沿着链的一个对象变为null,然后中断绑定。如果一个对象变成null,那么WPF会有效地从PropertyChanged调用中取消订阅(因为没有任何对象可以侦听),并且从不会看到新值被设置,从而可以防止其发挥作用。

+0

感谢您的快速和翔实的答案! – JPProgrammer 2013-02-28 05:50:45

+0

@JPProgrammer“实际上,绑定偶尔不会存活”......所以,如果链中的一个对象为空,那么如何避免或防止绑定被破坏? – blt 2013-10-29 01:05:04

+0

@blt除了没有链中的对象变为空,我不是100%确定的,实际上。我主要是得到顶级绑定刷新,这导致它再次找到它... – 2013-10-29 16:38:35