簡體   English   中英

發送INotifyPropertyChanged時,窗口屬性數據綁定不會更新,但是子元素屬性是

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

我有一個窗口,其屬性和子元素屬性綁定到名為Data的類:

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

    InitializeComponent();
}

在我的MainWindow窗口中創建了TerminalOverlay窗口,如下所示:

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的主窗口傳遞。 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>

諸如Input_TextBox FontSize類的屬性會正確更新,但Window屬性中的TopLeft不會正確更新。

您的posX是一個Nullable變量:它們具有“特殊”綁定圖

在這里試試

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM