Window 属性 发送 INotifyPropertyChanged 时数据绑定未更新,但子元素属性已更新

Window property databinding not updating when INotifyPropertyChanged sent, but child element properties are

我有一个 window,其属性和子元素属性绑定到一个名为 Data:

的 class
public TerminalOverlay(Data dataContext)
{
    DataInstance = dataContext;
    DataContext = DataInstance;

    InitializeComponent();
}

windowTerminalOverlay在我的MainWindowwindow中创建,如下:

public void MainWindow_Loaded(object sender, EventArgs e)
{
    _terminalOverlayWindow = new TerminalOverlay(_dataInstance);
    _terminalOverlayWindow.Owner = this;
    _terminalOverlayWindow.Show();
}

_dataInstance在MainWindow的构造函数中被实例化,其中的"problem"属性之一如下:

public double ? PosX
{
    get
    {
        return _posX == null ? _defaultPosX : _posX;
    }
    set
    {
        _posX = value;

        OnPropertyChanged("PosX");
    }
}

其中OnPropertyChanged的实现方式如下: public 事件 PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(字符串属性名) { 如果(PropertyChanged!= null) { PropertyChanged(这个,新的 PropertyChangedEventArgs(propertyName)); } }

Data 对象是从创建 TerminalOverlay 的主 window 传递过来的。 Data 对象还实现了 INotifyPropertyChanged,因此当我从主 window 更新 Data 对象中的属性时,它们反映在 TerminalOverlay window.

但是,这仅适用于 TerminalOverlay window 的子元素。 TerminalOverlay window 本身的属性最初设置为存储在数据 class 中的值,但它们似乎不会更新,即使子元素会更新。

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

此外,TerminalOverlay.xaml 如下所示:

<Window x:Class="Background_Terminal.TerminalOverlay"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Background_Terminal"
        mc:Ignorable="d"
        Title="TerminalOverlay" Height="200" Width="800" Left="{Binding PosX, Mode=OneWay}" Top="{Binding PosY, Mode=OneWay}" AllowsTransparency="True" WindowStyle="None" ResizeMode="NoResize" Background="Transparent" Loaded="TerminalOverlay_Loaded">
    <Grid>
        <TextBox x:Name="TerminalData_TextBox" BorderThickness="0" FontFamily="Consolas" Background="Transparent" IsReadOnly="True" IsReadOnlyCaretVisible="True" FontSize="{Binding FontSize}" Foreground="{Binding FontColor}" Text="{Binding TerminalDataDisplay, Mode=OneWay}"/>
        <TextBox x:Name="Input_TextBox" VerticalAlignment="Bottom" FontSize="{Binding FontSize}" Foreground="{Binding FontColor}" />
    </Grid>
</Window>

Input_TextBox 中的 FontSize 等属性会正确更新,但 Window 属性中的 TopLeft 不会正确更新。

您的 posX 是一个 Nullable 变量:他们有 "special" 绑定艺术

在这里试试这个

Left="{Binding PosX, Mode=TwoWay, TargetNullValue=''}"