使用INotifyPropertyChanged的WPF绑定不会更新

Chr*_* D. 7 wpf inotifypropertychanged

当我更新它所绑定的属性时,我在更新时似乎遇到严重问题让我的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);
            }
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

这与我在以下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>
Run Code Online (Sandbox Code Playgroud)

该应用程序定义如下:

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)
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我的绑定可能有问题吗?

我正在使用MSVC 2010 Express.

小智 8

问题是,你必须为一个实例变量,_model的WpfModel,是不是多数民众赞成被用作窗口的DataContext的相同的实例.因此,它不受任何约束,它的PropertyChanged将始终为null.

更改您的XAML以将datacontext设置为:

<Window.DataContext>
            <vm:AppModel x:Name="_model" />
</Window.DataContext>
Run Code Online (Sandbox Code Playgroud)

摆脱后面代码中声明的实例变量,并修复OnPropertyChanged实现(使用参数而不是文字字符串"prop"),它可以工作.


Leo*_*rke 5

这一行:

var e = new PropertyChangedEventArgs("prop");
Run Code Online (Sandbox Code Playgroud)

应该:

var e = new PropertyChangedEventArgs(prop);
Run Code Online (Sandbox Code Playgroud)

您正在传递字符串"prop",因此不会触发侦听"Count"的绑定值.

**编辑**基于你的其他评论(答案?)我认为我最好用修复更新这个 - 你可以使用已经给出的答案当然但我不想复制别人:).

将其添加到您的点击处理程序:

((AppModel)this.DataContext).Count += 1;
Run Code Online (Sandbox Code Playgroud)