WPF INotifyPropertyChanged 如何工作?

2024-04-25

这是在 WPF/C# 中使用绑定的典型 INotifyPropertyChanged 实现。

namespace notifications.ViewModel
{
    class MainViewModel : INotifyPropertyChanged
    {
        public const string NamePropertyName = "CheckBoxState";
        private bool _checkboxstate = true;

        public bool CheckBoxState
        {
            get { return _checkboxstate; }
            set
            {
                if (_checkboxstate == value) return;
                _checkboxstate = value;
                RaisePropertyChanged(NamePropertyName);
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

I also have a XAML code that has a binding to CheckBoxState. enter image description here

<Grid>
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <CheckBox Content="Click Me" IsChecked="{Binding Path=CheckBoxState, Mode=TwoWay}" />
        <TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />
    </StackPanel>
</Grid>

这是用于在 DataContext 和模型之间链接的 MainWindow.xaml.cs。

public partial class MainWindow : Window
{
    notifications.ViewModel.MainViewModel model = new notifications.ViewModel.MainViewModel();

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = model;
    }
}

当用户设置该复选框时,我认为会发生如下情况:IsChecked变为真,并且与"{Binding Path=CheckBoxState, Mode=TwoWay}", CheckBoxState属性变为真实调用RaisePropertyChanged()并相应地PropertyChanged()。由于该函数的参数是CheckBoxState, 每个与 Path 的绑定CheckBoxState被通知自行更新。

  • 这个呼叫如何激活<TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />? C# 有何魔力让这一切成为可能?
  • Why is if (PropertyChanged != null)必要的?谁将 PropertyChanged 设置为什么值?
  • 的含义Mode=TwoWay看起来它不仅可以发出变化信号,而且当绑定中其他同名的Binding元素发生变化时也会更新内容,那么OneWay模式呢?我们可以将绑定设置为仅源或仅目标吗?

这个呼叫如何激活? C# 背后的魔力是什么 这使它成为可能?

这段代码创建了一个Binding将 TextBlock 的 Text 属性链接到 ViewModel 属性的对象。它还向 ViewModel 的 PropertyChanged 事件添加一个事件处理程序,以便在 ViewModel 触发 PropertyChanged 事件(使用正确的属性)时更新文本值。

Why is if (PropertyChanged != null)必要的?由谁设立 属性更改为什么值?

如果 PropertyChanged 事件为 null,则触发该事件将导致 NullReferenceException。

的含义Mode=TwoWay看起来它不仅可以发出信号 更改,而且当其他 Binding 元素具有时也会更新内容 绑定中的同名发生变化,那么OneWay模式呢?我们可以吗 将绑定设置为仅源还是仅目标?

绑定方式有:

  • TwoWay:当 ViewModel 属性更改时更改绑定值,反之亦然
  • OneWay:仅当 ViewModel 属性更改时更改绑定值
  • OneWayToSource:仅当绑定值更改时更改 ViewModel 属性
  • OneTime:仅在创建应用程序或数据上下文更改时将绑定值设置为 ViewModel 属性的值。

您可以在这里阅读有关它们的更多信息:http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF INotifyPropertyChanged 如何工作? 的相关文章

随机推荐

  • Ghostscript 9.07:PDF/X-1a:2001:缺少 PDF/X 输出意图

    您能告诉我如何嵌入 PDF X 输出意图吗 当我检查预检时 我报告 PDF X 1a 2001 PDF 文件中缺少 PDF X 输出意图 PDF 文件中遇到的问题 1 PDF X 1a 2001 PDF X version is not P
  • VS2017 构建失败 - DOCKER_REGISTRY

    我正在开始使用 Docker 并熟悉 NET Core 和 Visual Studio 2017 我创建了一个名为 WebApplicationCore21 的新 Web 应用程序 Razor Pages 并启用了 Docker 支持 并立
  • 复制延迟 - 超过 max_slot_wal_keep_size,WAL 段未删除

    Summary 我们正在使用max slot wal keep size来自 PostgreSQL https www postgresql org docs current runtime config replication html1
  • Ember.js - 根据对象属性更新 CSS 宽度

    正如中提到的 安多罗夫的回答 https stackoverflow com a 32593118 565877 OP的理想代码 div style width 1 现在从 Ember 1 10 开始几乎可以正常工作 我是 Ember js
  • 在项目之间共享 ASP.NET MVC 部分视图

    在应用程序之间共享公共部分视图的最佳方式是什么 我创建了一个单独的程序集 其中包含 ascx 文件中的部分视图 一些与该视图配合使用的脚本以及一个 HtmlHelper 扩展方法 以便更轻松地创建部分视图 但是 当从 ASP NET MVC
  • TensorFlow 数据集的函数 cache() 和 prefetch() 有何作用?

    我正在关注 TensorFlow图像分割 https www tensorflow org tutorials images segmentation教程 其中有以下几行 train dataset train cache shuffle
  • Django REST Framework 分页链接不使用 HTTPS

    我正在为某个运行良好的 DRF 端点设置分页 但是 当部署在使用 HTTPS 的服务器上时 下一页和上一页的链接是通过http 代替https 这会导致浏览器阻止对下一页 上一页的请求 我已经仔细检查了初始请求是否已通过 HTTPS 发出
  • Android Studio 中的“应用更改”按钮被禁用(灰色)

    我已将项目的 minSdkVersion 设置为 19 并启用 Instant Run 我已在运行 API 21 的设备中部署了该应用程序 但 应用更改 按钮呈灰色 当我将鼠标悬停在该按钮上时 它显示 No Active App launc
  • 如何禁用 django 中应用程序的一种模型的迁移

    我有一个使用 2 个数据库的应用程序 1 个是默认数据库 另一个是自定义数据库 所以我的模型中有两个使用默认数据库 其他模型使用自定义数据库 我不想在运行 make migrations 命令时迁移自定义数据库模型 请帮忙 您可以通过设置选
  • 使用 NAN 替换强制转换非数字 numpy 数组

    考虑数组 x np array 1 2 a 绑定转换为浮点数组会引发异常 x astype np float ValueError could not convert string to float a numpy 是否提供任何有效的方法将
  • scala案例类问题

    我有两个关于 案例类的问题 可以用作 case head tail gt 它是如何工作的 意思是 Scala 用于将 List 实例与 case 类进行匹配的流程到底是什么 鉴于我有一个类 MyClass 带有运算符 op 我可以创建一个名
  • AWS ECS架构

    我有一个 React 前端和 Flask 后端 我想用 ECS 部署它们 我想让反应应用程序面向公众 并将烧瓶服务器隐藏起来 无法从外界访问 根据我的阅读 该方法应该如下 为 Flask 服务器创建公共子网和私有子网 并在公共子网上创建 N
  • 如何使用 kubectl 列出 kubernetes 中应用的自定义资源定义

    我最近应用了这个 CRD 文件 https raw githubusercontent com jetstack cert manager release 0 11 deploy manifests 00 crds yaml With ku
  • 类成员函数的 std::bind

    我有这个代码 include
  • 有什么方法可以判断我的 iPhone 应用程序在运行时是否在调试器下运行?

    如果我的错误处理代码在调试器下运行 我希望它的行为有所不同 具体来说 如果我在手机上运行 未连接到调试器并且断言失败 我想将错误发送到我的服务器 当我在gdb下时 我想闯入调试器 虽然我可以想象苹果将如何编写代码 但我找不到任何关于测试调试
  • MVC 3 保持短网址

    我有 MVC3 应用程序 我想在其中保留短 URL 最好的或干净的方法是什么 假设我有两个控制器 帐户和主页 我在帐户控制器中拥有所有与帐户相关的任务登录 注销 配置文件 常见问题解答等 家庭控制器中的所有主要任务 如任务 A 任务 B 和
  • 未找到 GnuTLS Libnetttle 3.4

    当我尝试配置 GnuTLS 时 收到错误消息 未找到 Libnetttle 3 4 我安装了 nettle 3 4 1 1 库文件位于 usr lib 中 即使我指定了环境变量NETTLE LIBS直接地 export NETTLE LIB
  • 当主干/分支/标签结构混乱时,如何从 Subversion 迁移到 Mercurial?

    我想将存储库从 Subversion 转换为 Mercurial 但是当我最初设置存储库时 我以最懒的方式完成了它 随着时间的推移 该结构不断变形和恶化 此时已有 5 年历史 尽管如此 我还是想保留尽可能多的历史 即使我必须弄脏并手动将东西
  • codecept:未找到命令

    我全新安装了 Ubuntu 在安装 Yii2 等之后 我似乎无法再运行 codecept 了 我用的是Yii2 我需要在composer json 中使用最新的codecept 版本 该版本工作正常 但我似乎找不到一种方法来让代码接收再次运
  • WPF INotifyPropertyChanged 如何工作?

    这是在 WPF C 中使用绑定的典型 INotifyPropertyChanged 实现 namespace notifications ViewModel class MainViewModel INotifyPropertyChange