При отправке INotifyPropertyChanged привязка данных свойства окна не обновляется, но свойства дочернего элемента - PullRequest
1 голос
/ 23 июня 2019

У меня есть окно, свойства и свойства дочернего элемента которого связываются с классом с именем 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 eventPropertyChangedEventHandler 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 обновился, просто окно не уведомляется об обновлении.

Кроме того, 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, корректно обновляются, но Top и Left в свойствах Window не обновляются.

1 Ответ

2 голосов
/ 23 июня 2019

ваш posX является переменной Nullable: у них есть "специальная" привязка

попробуйте это здесь

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...