首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在不使用字符串名称的情况下引发PropertyChanged事件

在不使用字符串名称的情况下引发PropertyChanged事件,可以通过以下步骤实现:

  1. 创建一个自定义的PropertyChangedEventArgs类,该类继承自System.ComponentModel.PropertyChangedEventArgs,并添加一个新的构造函数,该构造函数接受一个Lambda表达式作为参数,用于表示属性的更改。
代码语言:csharp
复制
public class MyPropertyChangedEventArgs<T> : PropertyChangedEventArgs
{
    public MyPropertyChangedEventArgs(Expression<Func<T>> propertyExpression)
        : base(GetPropertyName(propertyExpression))
    {
    }

    private static string GetPropertyName(Expression<Func<T>> propertyExpression)
    {
        MemberExpression memberExpression = (MemberExpression)propertyExpression.Body;
        return memberExpression.Member.Name;
    }
}
  1. 在需要引发PropertyChanged事件的属性的setter方法中,使用Lambda表达式创建一个新的MyPropertyChangedEventArgs实例,并通过RaisePropertyChanged方法引发事件。
代码语言:csharp
复制
private string _myProperty;
public string MyProperty
{
    get { return _myProperty; }
    set
    {
        if (_myProperty != value)
        {
            _myProperty = value;
            RaisePropertyChanged(() => MyProperty);
        }
    }
}

private void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression)
{
    PropertyChanged?.Invoke(this, new MyPropertyChangedEventArgs<T>(propertyExpression));
}
  1. 在需要订阅属性更改的地方,通过订阅PropertyChanged事件来处理属性更改。
代码语言:csharp
复制
public event PropertyChangedEventHandler PropertyChanged;

private void OnMyPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == nameof(MyProperty))
    {
        // 处理MyProperty属性的更改
    }
}

以上是一种在不使用字符串名称的情况下引发PropertyChanged事件的方法。通过自定义的MyPropertyChangedEventArgs类,可以使用Lambda表达式来表示属性的更改,从而避免了硬编码属性名称的问题。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# 特性 System.ComponentModel 命名空间属性方法大全,System.ComponentModel 命名空间特性

(Inherited from ValidationAttribute) ErrorMessageResourceName 获取或设置错误消息资源名称,在验证失败情况下,要使用该名称来查找ErrorMessageResourceType...PropertyChangedEventArgs 为 PropertyChanged 事件提供数据。...PropertyChangedEventManager 提供 WeakEventManager 实现,以便可以使用“弱事件侦听器”模式附加 PropertyChanged 事件侦听器。...StringConverter 提供用于在字符串对象与其他表示形式之间实现相互转换类型转换器。 SyntaxCheck 提供方法来验证计算机名称和路径是否符合特定语法。 此类不能被继承。...PropertyChangedEventHandler 表示将处理 PropertyChanged 事件方法,该事件在更改组件上属性时引发

4.2K30
  • Binding(二):控件关联和代码提升

    上节我们讲到,使用Binding,我们可以关联后台代码中属性,在某些情况下,我们可能需要将两个控件关联起来,借助Binding,我们也可以轻松实现。...事件去手动控制Button显示等等,但我们如果使用Binding,则会简单很多,请看如下代码: Binding有个ElementName属性,是专门用于跟控件做绑定,把某个控件名字赋给它...第二个Button则是使用Source形式,借助x命名空间Reference指令,拿到名称为CB控件引用,将其作为源,效果是一样。..."; //控件名 运行效果如下: 当然,这是在两个控件绑定属性类型都一致情况下,如果不一致呢?...代码提升 在不使用第三方框架情况下,我一般会使用如下代码来实现INotifyPropertyChanged接口: public class NorifyBase:INotifyPropertyChanged

    51020

    谈谈 INotifyPropertyChanged 实现

    } set { _myField = value; OnPropertyChanged("MyProperty"); } } } 表达式实现方式 对 lambda 表达式比较熟悉同学可以考虑...lambda 表达式实现属性名称传递, 在 NotifyPropertyChanged 类添加一个这样方法: protected void SetProperty(ref T propField...myField; } set { base.SetProperty(ref _myField, value, () => this.MyProperty); } } } 这样一来, 把属性名称字符串传递改成了...先定义一个拦截器, 重写 PostProcess 方法, 当发现是调用以 set_ 开头方法时, // 一般就是设置属性了, 可以在这里触发相应事件。...PropertyChanged 事件, 而且只能触发一个事件, 而在实际开发中, 偶尔需要设置一个属性, 触发多个 PropertyChanged 事件

    55120

    INotifyPropertyChanged 接口

    INotifyPropertyChanged 接口 用于向客户端(通常是执行绑定客户端)发出某一属性值已更改通知。 例如,考虑一个带有名为 FirstName 属性 Person 对象。...若要提供一般性属性更改通知,则 Person 类型实现 INotifyPropertyChanged 接口并在 FirstName 更改时引发 PropertyChanged 事件。...为绑定类型每个属性提供更改事件。 上述这两个功能不要同时实现。 示例 下面的代码示例演示如何实现 INotifyPropertyChanged 接口。...在运行此示例时,您将注意到绑定 DataGridView 控件无需重置绑定即能反映数据源中更改。...如果使用 CallerMemberName 属性,对 NotifyPropertyChanged 方法不必指定属性名称作为字符串参数。

    1.5K10

    本地化入门

    ,而使用GetForCurrentView情况下ReSharper又没有错误提示。...首先是设计时支持,对本地化来说,设计时支持主要包含3部分: 在编写XAML时可以得到资源智能感知 有完整设计视图 在不同语言之间切换 第一点,没有,而且写错属性名称还不会在编译时报错,而是最惨烈方式呈现...更改ApplicationLanguages.PrimaryLanguageOverride,会异步地触发ResourceContext.QualifierValuesMapChanged事件,可以监听这个事件并更新...很少有机会在C#中用到索引器,XAML中也很少用到Binding到字符串索引语法,就是这两个功能在本地化中帮了大忙。...本地化方案差不多,设计时支持几乎完美,包括智能感知和错误提示,不过还是没办法解决系统组件中本地化问题(TextBox右键菜单)。

    2.1K40

    WPF 给 Grid 辅助方法 添加行列名称绑定

    有一些设计师喜欢改改改,界面的整体布局总是变更,给 Grid 加一列删一行等,每次这样更改时候,都需要小心修改 Grid 里面的元素设置行列序号。...如果 Grid 行列数量比较多,那么此时行列序号可读性将会降低,本文来告诉大家一个简单方法,可以给 Grid 行列添加名称绑定,让元素绑定到行列可以不使用序号,而是使用名称 在开始之前让大家看一下效果...,通过附加属性实现让 Grid 行列名称绑定。...加行列或删除行列时候,减少修改一些元素行列布局。...因为元素绑定是行列名而不是序号,因此顺序修改时候不会影响原有的界面代码 当前这个功能已合入到 HC 控件中,请通过 NuGet 安装 HandyControl 库 如不使用库,自己实现也简单,请看下面代码

    77710

    FluentValidation在C# WPF中应用

    ,比如1)对象属性子属性,VM有个学生属性Student,需要验证他姓名、年龄等,2)集合属性,动态生成表单验证类; 能简单提供两种验证样式; 先看实现效果图: unsetunset3....集合类 - Field 此类用作ViewModel中集合项使用,模拟动态表单数据校验,简单包含4个属性:字段名称、字段显示名称、数据类型、数据值,表单主要根据数据类型验证输入数据值是否合法。...(见Age)、字符串不能为空和长度限制(见Name)、字符串正则表达式验证(见Zip)。...ViewModel属性验证和Student及Field类似,这里我加上了保存(SaveCommand)和取消(CancelCommand)两个命令,其中保存命令需要所有属性验证通过才可用,通过注册属性变化事件...PropertyChanged,在变化事件处理程序中验证: PropertyChanged += Validate; CurrentStudent.PropertyChanged += Validate

    17210

    WPF 属性变动后业务处理及恢复原始值方法

    INotifyPropertyChanged 接口(不然就没有 PropertyChanged 事件嘛)。...故事当然还要从绑定基类中 PropertyChanged 事件说起,不知道大家学习 WPF 时候有没有觉得很纳闷,这是一个事件,但是并没有看到有什么地方订阅它,那么整个逻辑是怎么走通呢?...这部分其实主要就是通过订阅 PropertyChanged 事件来实现,无论是借助于 自定义绑定基类、PropertyChanged.Fody、还是其它框架或库( CommunityToolkit.Mvvm...)都是可以,因为它们都会引入 PropertyChanged 事件。...这部分是综合应用了 PropertyChanged 事件和 PropertyChanging 事件;前者因为主要用于进行业务处理,所以属性原始值还原操作发起者一般也就是它了;后者则是用于获取和存储原始值

    3.4K50

    代码质量规则

    CA1030:在适用处使用事件 该规则检测名称通常用于事件方法。 如果为响应明确定义状态更改而调用一个方法,则应由事件处理程序调用该方法。 调用该方法对象应引发事件而不是直接调用该方法。...CA1713:事件不应具有 before 或 after 前缀 事件名称以“Before”或“After”开头。 若要命名按特定顺序引发相关事件,请使用现在时或过去时指示一系列操作中相对位置。...CA1806:不要忽略方法结果 创建一个新对象,但从不使用该对象;或者调用会创建并返回一个新字符串方法,但从不使用这个新字符串;或者 COM 或 P/Invoke 方法返回一个从不使 HRESULT...CA2219:在异常子句中不引发异常 如果在 finally 或 fault 子句中引发异常,新异常将隐藏活动异常。 当在 filter 子句中引发异常时,运行时会在不提示情况下捕捉异常。...CA5364:不使用已弃安全协议 传输层安全性 (TLS) 通常使用超文本传输协议安全 (HTTPS) 保障计算机之间通信安全。

    2.1K30

    C# API中模型和它们接口设计

    不过,在使用代码生成工具生成DTO时,通常会使用一些简单接口(INotifyPropertyChanged)。 对象图(Object Graph) 一个对象图由一个对象和所有可触及子对象组成。...基于这样设计,可以将子对象分解出来,并在没有父对象情况下对其进行测试。测试本身可以监控只有父对象能够处理事件。 验证——数据模型唯一必须具备功能 接下来我想谈谈数据模型可能会实现可选特性。...如果一个类实现了INotifyPropertyChanged,并且值发生变化,就会触发PropertyChanged事件。 不管指定属性是有效还是无效,都应该触发ErrorsChanged事件。...如果对象级验证已经发生变化,则应使用null或字符串触发ErrorsChanged事件。...对于我自己集合,我经常会公开一个INotifyItemPropertyChanged接口,用于将集合中对象任意PropertyChanged事件转成单个ItemPropertyChanged事件

    1.6K20

    《101 Windows Phone 7 Apps》读书笔记-PASSWORDS & SECRETS

    Decrypt从Base64编码字符串开始,将其转换为写入crypto stream字符。然后,使用相应ToArray方法将解密后UTF8编码数据转换为字符串。    ...图21.3 应用程序栏展开页面 注意: ➔ 如图21.3所示,应用程序栏第一个menu起到下面的作用:在用户没有登录情况下给出密码提示,在用户已经登录情况下给出密码修改页面。...列表21.9所示,Note通过实现INotifyPropertyChanged接口来完成此功能。 ➔INotifyPropertyChanged只有一个成员- PropertyChanged事件。...➔被触发PropertyChanged事件由OnPropertyChanged helper方法来处理。为了避免bug,将一个handler变量赋值给event handler字段。...➔某些属性会因为额外属性发生改变而触发PropertyChanged事件

    1.1K90

    Caliburn.Micro学习笔记(四)----IHandle实现多语言功能

    源码下载地址在文章最下边 多语言是资源文件建一个MyLanguage资源文件再添加一个MyLanguage.en-US资源文件如果你还想要 其它语言可自己添加。...两个资源文件里写上你要文本如下图这样,它们名称是一样只是值一个是中文一个是英文 ?  ...下面我们就要开始Caliburn.MicroIHandle去实现多语言了 先写一个资源接口 public interface IResource { string...EventHandler LanguageChanged;事件是如果我们还想切换完语言后做一些事件就可以写在这个事件里 再写一个实现 IResult类 [Export(typeof(IResource...Key就是我资源文件里名称项 value是资源文件里值项看一下它get也可以看来出是通过IResourceTaskgetstring把值取出来 接口信息方法Handle(LanguageChangedMessage

    85070

    C# 值得永久收藏WPF项目实战(经典)

    02重要知识点 CM框架配置和启动; CM框架自带ioc容器SimpleContainer用法; MVVM开发模式; 事件聚合器EventAggregator进行事件发布和订阅; 属性通知: ① CM...:Common.Logging和log4net用法; CM框架下命名约定以及事件关联; 第三方库Xceed.Wpf.Toolkit.dll做等待窗体; CM框架下Conductor用法; CM框架下IWindowManager...03运行结果 04项目说明 项目主要包括类文件如下图: ① MainWindowViewModel.cs类: using PropertyChanged; using System.Collections.ObjectModel...; ListBoxItems_SelectionChanged()是listbox选择改变事件: <ListBox Name="ListBoxItems" Grid.Column="0" SelectedItem...Task.Run(action); }); 等待窗体BusyIndicator ,需要引用第三方库Xceed.Wpf.Toolkit, 并添加名称空间

    4.9K10

    Vue3 $emit指南--包含选项API、组合API以及 setup 语法糖

    当我们 emit 一个事件时,我们一个或多个参数调用一个方法: eventName: string - 事件名称 values: any - 通过事件传递参数 下面是一个内联 emit例子,<button...+= i + j + k" 现在,我们知道如何在我们模板中 emit 内联事件,但在更复杂例子中,如果我们从SFCscript 中 emit 一个事件会更好。...在这种情况下,我们可以使用 defineEmits: 指定组件要 emit 事件 为每个事件添加验证信息 可以访问与context.emit相同值 在最简单情况下,defineEmits是一个字符串数组...,每个字符串是一个事件名称。...当在 emits 选项中定义了原生事件 ( change) 时,将使用组件中事件替代原生事件侦听器。

    3.8K10
    领券