我希望进行一些不那么重复和浪费的编码,需要使用 INotifyPropertyChanged
接口和自定义属性。
背景
今天,为了在窗口中使用 MVVM
动态更新值,我们需要执行以下操作:
private string _SomeProp;
public string SomeProp
{
get => _SomeProp;
set
{
_SomeProp = value;
OnPropertyChanged();
}
}
public void OnPropertyChanged([CallerMemberName] string name = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
public event PropertyChangedEventHandler PropertyChanged;
建议与问题
自定义属性
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace MyProject.Models;
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class PropertyChangedAttribute : Attribute, INotifyPropertyChanged
{
public PropertyChangedAttribute([CallerMemberName] string propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
public event PropertyChangedEventHandler PropertyChanged;
}
将自定义属性与属性一起使用:
[PropertyChanged]
public string SomeProp { get; set; }
基本上,我不需要为窗口中的每个字段创建完整属性,而只需要拥有简单的属性。
但由于某些原因,它不起作用,而在调试时,编译器甚至不进入自定义属性类。
更新
因此,在研究了这个主题后,属性CallerMemberName
是在编译器级别处理的,意味着编译器正在寻找该属性,并将属性/方法/等名称传递给使用该属性的方法。
所以,基本上,如果不编辑编译器代码及其行为,这样的事情是不可能实现的。
set;
中。 - Jeroen van Langenset;
时触发,所以属性也不起作用了? - Yaron Binder