【问题标题】:WPF: bind to an object's property; what happens when the object changes?WPF:绑定到对象的属性;当对象改变时会发生什么?
【发布时间】:2013-02-28 01:57:59
【问题描述】:

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

例如,ViewModel:

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();

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

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

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

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

    【讨论】:

    • @JPProgrammer "在实践中,绑定偶尔会无法生存" ... 那么在链中的一个对象为空的情况下,如何避免/防止绑定被破坏?跨度>
    • @blt 除了链中没有对象变为空之外,实际上我不是 100% 确定。我主要不得不让顶级绑定刷新,这会导致它再次找到它......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多