4

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

例如,视图模型:

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"); }
        }
}

然后在一个窗口(将 ViewModel 设置为 DataContext)中,您有一个绑定到该对象的控件,例如:

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

然后在某处重置 ViewModel.TheObject(在绑定完成后):

ViewModel.TheObject = new TheObjectClass();

在我的测试中(不是专门针对此代码,这只是我的应用程序中代码的简化示例),有时绑定会存活,有时会停止工作。我应该期待在这里发生什么?对我来说,当父对象实例化为另一个对象时,属性绑定会中断,这似乎是合乎逻辑的,但有时它似乎仍然存在,这真的让我感到困惑。

4

1 回答 1

7

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

在实践中,绑定偶尔会无法生存,但这通常是因为在某个时间点,链上的一个对象变为null,然后会破坏绑定。如果一个对象变为null,WPF 会有效地取消订阅PropertyChanged调用(因为没有要监听的对象),并且永远不会看到设置了新值,这反过来又会阻止它运行。

于 2013-02-28T02:04:20.917 回答