首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用INotifyPropertyChanged的WPF绑定不会更新

使用INotifyPropertyChanged的WPF绑定不会更新
EN

Stack Overflow用户
提问于 2010-06-18 21:05:39
回答 2查看 19.8K关注 0票数 7

当我更新绑定的属性时,我似乎在更新WPF UI时遇到了严重的问题。下面是我的视图模型类定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
            }
        }
    };
}

这在下面的XAML中绑定到我的简单UI:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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>

应用程序的定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-19 11:02:52

问题是您作为实例变量_model使用的WpfModel与用作窗口DataContext的实例不是同一个实例。因此,它不受任何约束,并且它的PropertyChanged将始终为空。

将用于设置datacontext的XAML更改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Window.DataContext>
            <vm:AppModel x:Name="_model" />
</Window.DataContext>

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

票数 8
EN

Stack Overflow用户

发布于 2010-06-18 21:20:05

这一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var e = new PropertyChangedEventArgs("prop");

应该是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var e = new PropertyChangedEventArgs(prop);

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

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

将此代码添加到您的单击处理程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
((AppModel)this.DataContext).Count += 1;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3073085

复制
相关文章
苹果证书p12和描述文件的创建方法
在2020年之前,我们在使用香蕉云编创建苹果证书的时候,只需要注册苹果开发者账号,但不需要缴费成为开发者。
iOS程序应用
2022/11/10
8811
苹果证书p12和描述文件的创建方法
https://blog.csdn.net/handsome0916/article/details/113779348
爱学iOS的小麦子
2023/05/09
8430
苹果证书p12和描述文件的创建方法
如何在Linux中创建文件?多个文件创建操作命令。
如果文件file1.txt不存在,则上面的命令将创建该文件,否则,它将更改其时间戳。
用户5005176
2021/08/10
39.2K0
如何生成ipa文件?
请注意,生成 .ipa 文件的详细步骤可能因开发工具的不同而有所变化。上述步骤提供了一个一般性的概述,你需要根据你使用的具体开发工具和工作流程进行相应的调整。
用户10578779
2023/05/26
1.2K0
如何生成ipa文件?
创建出来的maven项目没有iml文件
在终端输入如下代码,然后等待下载就好 mvn idea:module
2020/10/23
2.7K0
创建出来的maven项目没有iml文件
如何在windows下和linux下获取文件(如exe文件)的详细信息和属性
最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需要获取服务器上新程序的版本号信息。最后由我用java实现linux上exe文件的版本号读取功能。下面是详细代码:
业余草
2019/01/21
6K0
如何在windows下和linux下获取文件(如exe文件)的详细信息和属性
java p12证书_java引用微信支付的p12证书文件
public static String PATH1 = “E:\\project_ceshi\\apiclient_cert.p12”;//linux
全栈程序员站长
2022/09/10
1.6K0
java p12证书_java引用微信支付的p12证书文件
[技巧篇] 如何在不会的情况下解释 Python 设置文件的缓冲的问题
美好的中秋,朋友圈在享受悠闲周末的时候,刚入门 Python 的程序员小R在公司埋头加班,不知时间几何,一不小心把下周的工作捯饬完了,心情愉悦,不能自拔。
编程文青李狗蛋
2019/09/17
6290
[技巧篇] 如何在不会的情况下解释 Python 设置文件的缓冲的问题
如何在 Linux 中创建带有特殊字符的文件?
在 Linux 系统中,创建文件是进行各种操作的基础。有时候,我们需要创建带有特殊字符的文件,例如包含空格、特殊符号或非ASCII字符的文件。本文将详细介绍在 Linux 中如何创建带有特殊字符的文件,以便您能够轻松地完成这样的任务。
网络技术联盟站
2023/07/14
7060
如何在 Linux 中创建带有特殊字符的文件?
最简单易懂的ios(p12)证书上传流程,描述文件创建流程
1.推荐一个七天免费试用工具,七天体检感觉OK也可继续购买使用,下载地址:http://www.appuploader.net/
爱学iOS的小麦子
2023/05/09
4390
最简单易懂的ios(p12)证书上传流程,描述文件创建流程
用AppUploader轻松上传IPA文件
2、一旦您的IPA包通过Appuploader自动上传,如果包的大小很大,上传可能需要一些时间。当出现以下提示时 (packages were uploaded successfully 进度条蓝色), 说明上传成功。
爱学iOS的小麦子
2023/03/02
4950
用AppUploader轻松上传IPA文件
如何在 Linux 中创建带有特殊字符的文件?
在 Linux 系统中,创建文件是进行各种操作的基础。有时候,我们需要创建带有特殊字符的文件,例如包含空格、特殊符号或非ASCII字符的文件。本文将详细介绍在 Linux 中如何创建带有特殊字符的文件,以便您能够轻松地完成这样的任务。
网络技术联盟站
2023/08/03
8050
如何在 Linux 中创建带有特殊字符的文件?
Roslyn 如何在 Target 引用 xaml 防止文件没有编译
在使用新的项目格式,可以使用 Target 添加项目,但是有一些项目需要在合适的时候添加,如果添加早了,那么会让用户看到这些文件,如果添加的时间是在引用编译之后,那么文件将无法进行编译。
林德熙
2018/09/19
1.1K0
Roslyn 如何在 Target 引用 xaml 防止文件没有编译
Roslyn 如何在 Target 引用 xaml 防止文件没有编译
在使用新的项目格式,可以使用 Target 添加项目,但是有一些项目需要在合适的时候添加,如果添加早了,那么会让用户看到这些文件,如果添加的时间是在引用编译之后,那么文件将无法进行编译。
林德熙
2022/08/04
7390
Roslyn 如何在 Target 引用 xaml 防止文件没有编译
用AppUploader轻松上传IPA文件
2、一旦您的IPA包通过Appuploader自动上传,如果包的大小很大,上传可能需要一些时间。当出现以下提示时 (packages were uploaded successfully 进度条蓝色), 说明上传成功。
iOS Magician
2023/03/21
3540
用AppUploader轻松上传IPA文件
免费苹果账号(apple id)申请ios证书p12真机调试
HBuilder可以直接打包越狱版的ipa包,但需要越狱手机才能安装,如果需要安装到没越狱的手机安装,需要自己申请ios证书打包。 一般是需要一个付费了的苹果开发者账号才能申请ios证书打包。 这里介绍用普通的没有付费的苹果账号(apple id),直接申请ios证书p12,打包安装到没有越狱的手机真机调试,完全免费。 当然如果要上架App Store还是需要注册一个付费的苹果开发者账号。 苹果开发者账号申请教程 申请ios证书打包ipa测试分五步进行 1.申请一个苹果账号 2.申请ios测试证书(p12)
iOS程序应用
2023/04/17
3.1K0
Flash开发iOS应用全攻略(五)——如何上传应用到iTunes Connect
上一篇我介绍了如何在iTunes Connect里准备应用。最后在这篇文章里我会简单介绍下如何来上传IPA到iTunes Connect。
iOS程序应用
2023/04/13
3710
iOS APP上架App Store其中一个步骤就是要把ipa文件上传到App Store
下面进行步骤介绍! 利用Appuploader这个软件,可以在Windows、Linux或Mac系统中申请ios和上传IPA到App Store Connect。
iOS Magician
2023/03/22
5830
iOS APP上架App Store其中一个步骤就是要把ipa文件上传到App Store
iosapp上架流程
通过本篇教程,可以学习到ios证书申请和打包ipa测试上架的完整流程,中途可能会遇到一些报错,一般在教程对常见错误都有解释,仔细看看,不清楚可以联系技术支持或者加群提问。
iOS程序应用
2022/11/17
1.2K0
点击加载更多

相似问题

有没有办法在没有Mac/XCode的情况下创建IPA文件?

221

如何基于其他.p12证书创建IPA

14

如何创建IPA文件?

32

无法创建IPA文件

12

如何创建.ipa文件&如何在iphone/ipad中安装.ipa?

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文