zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【wpf】绑定失效的情况

WPF 情况 绑定 失效
2023-09-11 14:14:50 时间

这种情况,也不知道这么总结,就说一下,当时情况!

 proInfo 是一个复合类,作为 ComboBox 的 SelectItem的绑定对象。

proInfo 本身是一个复合对象,它内部成员对象,与一个Run控件进行的绑定!

 一旦 ComboBox 的 SelectItem 被触发,或者说SelectItem生效后,上面这个绑定就失效了。

我目前的判断是,如果一个复合对象发生的变化,比如被赋值,那么,它内部成员对象参与的绑定都会失效!

2023年4月12日-----------

再次总结

这段时间,写代码,进一步确定了这个事实:

一个复合对象发生的变化,比如被赋值,那么,它内部成员对象参与的绑定都会失效!

那如何解决这个问题呢?就是将这个复合对象也设置通知!

例子:

public LightSourceInfo lightSourceInfo { get; set; } = new LightSourceInfo();

LightSourceInfo 是一个复合对象:

public class LightSourceInfo : BindableBase
    {
        public const string file_name = "光源参数";


        private int channelValue1;

        public int ChannelValue1
        {
            get { return channelValue1; }
            set { SetProperty(ref channelValue1, value); }
        }

        private int channelValue2;

        public int ChannelValue2
        {
            get { return channelValue2; }
            set { SetProperty(ref channelValue2, value); }
        }

    }

它的子对象,参与了binding。

一开始没啥问题。 后来我加了个功能,就是信息保存到文本(序列化),开始时读取文本(反序列化)。这样就会多了一个赋值语句:

lightSourceInfo = JsonConfigCtrl.Read<LightSourceInfo>(LightSourceInfo.file_name);

这样我的绑定就基本失效了!

那么我如果我将lightSourceInfo 也添加通知属性,我的绑定就又成功了:

//因为加了配置读取,所以有了直接的赋值,有赋值,还想bingding,就需要加,通知属性!
private LightSourceInfo _lightSourceInfo;
public LightSourceInfo lightSourceInfo
{
    get { return _lightSourceInfo; }
    set { SetProperty(ref _lightSourceInfo, value); }
}