WPF绑定与INotifyPropertyChanged不更新

7

我似乎在更新绑定属性时,无法让我的WPF UI更新。以下是我的视图模型类定义:

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);
            }
        }
    };
}

这是我的简单UI在以下XAML中绑定的:
<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属性中的任何值。调用increment可以正确更新模型,并且直接增加代码中所示的Count属性也可以正常工作。
问题在于,PropertyChanged事件处理程序似乎从未被添加。我可以通过调试器逐步执行代码并查看属性中的值更新,我甚至可以看到对OnPropertyChanged的调用,但PropertyChanged处理程序本身始终为空。
我的绑定有问题吗?
我正在使用MSVC 2010 Express。

你的 IncButton_Click 处理程序在你的示例中目前是空的;你确定你在 DataContext 中调用的是 AppModel 的 Increment 方法,而不是其他的 AppModel 实例吗? - Dan Bryant
2个回答

8
问题在于你作为实例变量的WpfModel,即_model,并不是用作窗口DataContext的同一个实例。因此,它不会被任何绑定,其PropertyChanged将始终为空。
请更改设置数据上下文的XAML如下:
<Window.DataContext>
            <vm:AppModel x:Name="_model" />
</Window.DataContext>

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


这个有效。 - Rushan De Silva

5
这行文字:
var e = new PropertyChangedEventArgs("prop");

should be:

var e = new PropertyChangedEventArgs(prop);

您正在传递字符串“prop”,因此绑定值监听“Count”将不会触发。

**编辑** 根据您的其他评论(答案?),我认为我最好更新一下这个修复 - 当然,您可以使用已经给出的答案,但我不想复制别人:)。

将此添加到单击处理程序中:

((AppModel)this.DataContext).Count += 1;

1
你在“修复”中犯了同样的错误 - 这里也要去掉引号 ;) - Reed Copsey
感谢更新,一旦我阅读了下面ArildF的帖子,我就开始确保我的_model实例变量确实是表单使用的那个,当然它并不是。 :-)<code> _model = this.DataContext as AppModel </code> 一旦我处理了“prop”拼写错误(哎呀!),一切都为我解决了。感谢每个人的有益回应! - Chris D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接