发送 INotifyPropertyChanged 时窗口属性数据绑定不更新,但子元素属性是

我有一个窗口,其属性和子元素属性绑定到一个名为的类Data:


public TerminalOverlay(Data dataContext)

{

    DataInstance = dataContext;

    DataContext = DataInstance;


    InitializeComponent();

}

窗口TerminalOverlay在我的窗口中创建MainWindow,如下:


public void MainWindow_Loaded(object sender, EventArgs e)

{

    _terminalOverlayWindow = new TerminalOverlay(_dataInstance);

    _terminalOverlayWindow.Owner = this;

    _terminalOverlayWindow.Show();

}

_dataInstance在 MainWindow 的构造函数中被实例化,其中的一个“问题”属性如下:


public double ? PosX

{

    get

    {

        return _posX == null ? _defaultPosX : _posX;

    }

    set

    {

        _posX = value;


        OnPropertyChanged("PosX");

    }

}

其中OnPropertyChanged的实现方式如下: public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }


该Data对象从创建TerminalOverlay. Data 对象还实现了INotifyPropertyChanged,因此当我从主窗口更新 Data 对象中的属性时,它们会反映在窗口中TerminalOverlay。


然而,这只是窗口的子元素的情况TerminalOverlay。窗口本身的属性TerminalOverlay最初设置为存储在 Data 类中的值,但它们似乎不会更新,即使子元素会更新。


我究竟做错了什么?查看可视化树我发现确实TerminalOverlay.DataContext.TopX更新了,只是没有通知窗口更新。


猛跑小猪
浏览 185回答 1
1回答

智慧大石

你的 posX 是一个 Nullable 变量:他们有“特殊”的绑定艺术在这里试试这个Left="{Binding PosX, Mode=TwoWay, TargetNullValue=''}"
打开App,查看更多内容
随时随地看视频慕课网APP