gpt4 book ai didi

WPF 与 INotifyPropertyChanged 的​​绑定(bind)不会更新

转载 作者:行者123 更新时间:2023-12-02 08:43:36 25 4
gpt4 key购买 nike

当我更新 WPF UI 所绑定(bind)的属性时,我似乎遇到了严重的问题。这是我的 View 模型类定义:

namespace WpfModel
{
class AppModel : INotifyPropertyChanged
{
private int _count = 7;

public int Count { get { return _count; }
set { _count = value; OnPropertyChanged("Count"); } }

public void Increment()
{
Count++;
}

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(string prop)
{
PropertyChangedEventHandler handler = this.PropertyChanged;

if (handler != null)
{
var e = new PropertyChangedEventArgs("prop");
handler(this, e);
}
}
};
}

这绑定(bind)到以下 XAML 中的简单 UI:

<Window x:Class="WpfModel.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:WpfModel"
Title="WPF Data Model Demo" Height="128" Width="284" >

<Window.DataContext>
<vm:AppModel />
</Window.DataContext>

<Grid Height="Auto" Width="Auto">
<Button Margin="0,0,12,12" Name="IncButton" Height="23" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75" Click="IncButton_Click" Content="Increment" />
<Label Content="Count Variable:" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="label1" VerticalAlignment="Top" />
<Label Height="28" Margin="116,12,0,0" Name="CountLabel" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Content="{Binding Path=Count}" />
</Grid>
</Window>

应用程序定义如下:

namespace WpfModel
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private AppModel _model = new AppModel();

public MainWindow()
{
InitializeComponent();

//_model = new AppModel();
}

private void IncButton_Click(object sender, RoutedEventArgs e)
{
}
}
}

当应用程序启动时,一切都很顺利,标签甚至最初显示模型的 Count 属性中的任何值。调用增量正确更新模型,并且直接增加 Count 属性(如代码所示)也可以正常工作。

这里的问题是,PropertyChanged 事件处理程序似乎永远不会被添加到。我可以单步执行调试器中的代码并查看属性更新中的值,甚至可以看到对 OnPropertyChanged 的​​调用,但 PropertyChanged 处理程序本身始终为 null。

我的绑定(bind)可能有问题吗?

我正在使用 MSVC 2010 Express。

最佳答案

问题在于,作为实例变量 _model 的 WpfModel 与用作窗口 DataContext 的实例不同。因此,它不受任何东西的约束,并且它的 PropertyChanged 将始终为 null。

更改 XAML 以将数据上下文设置为:

<Window.DataContext>
<vm:AppModel x:Name="_model" />
</Window.DataContext>

去掉后面代码中声明的实例变量,并修复 OnPropertyChanged 实现(使用参数而不是文字字符串“prop”),它就可以工作了。

关于WPF 与 INotifyPropertyChanged 的​​绑定(bind)不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3073085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com