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
在我的MainWindow
window中创建,如下:
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 属性中的 Top
和 Left
不会正确更新。
您的 posX 是一个 Nullable 变量:他们有 "special" 绑定艺术
在这里试试这个
Left="{Binding PosX, Mode=TwoWay, TargetNullValue=''}"
我有一个 window,其属性和子元素属性绑定到一个名为 Data
:
public TerminalOverlay(Data dataContext)
{
DataInstance = dataContext;
DataContext = DataInstance;
InitializeComponent();
}
windowTerminalOverlay
在我的MainWindow
window中创建,如下:
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 属性中的 Top
和 Left
不会正确更新。
您的 posX 是一个 Nullable 变量:他们有 "special" 绑定艺术
在这里试试这个
Left="{Binding PosX, Mode=TwoWay, TargetNullValue=''}"