![](/img/trans.png)
[英]WPF DataBinding not updating with 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属性中的Top
和Left
不会正确更新。
您的posX是一个Nullable变量:它们具有“特殊”绑定图
在这里试试
Left="{Binding PosX, Mode=TwoWay, TargetNullValue=''}"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.