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

时间:2019-06-23 07:52:46

标签: c# wpf datacontext

我有一个窗口,其属性和子元素属性绑定到名为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的实现如下:     公共事件PropertyChangedEventHandler PropertyChanged;     公共无效OnPropertyChanged(字符串propertyName)     {         如果(PropertyChanged!= null)         {             PropertyChanged(this,new PropertyChangedEventArgs(propertyName));         }     }

Data对象是从创建TerminalOverlay的主窗口传递的。数据对象还实现了INotifyPropertyChanged,所以当我从主窗口更新数据对象中的属性时,它们会反映在TerminalOverlay窗口中。

但是,TerminalOverlay窗口的子元素只有这种情况。 TerminalOverlay窗口本身的属性最初设置为存储在Data类中的值,但是即使子元素确实存在,它们似乎也没有更新。

我在做什么错?在视觉树中查看时,我发现TerminalOverlay.DataContext.TopX确实进行了更新,只是没有通知窗口更新。

此外,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>

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

1 个答案:

答案 0 :(得分:2)

您的posX是一个可为空的变量:它们具有“特殊的”绑定图

在这里尝试

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