【发布时间】:2022-02-23 13:39:54
【问题描述】:
我喜欢对需要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 在编译器级别进行处理,这意味着编译器正在寻找该属性,并且它本身将属性/方法/等...名称传递给使用该属性的方法属性。
所以基本上,如果不编辑编译器代码及其行为,这样的事情是不可能做到的。
【问题讨论】:
-
您认为 PropertyChangedAttribute 是在哪里调用的?不在属性的
set;中。 -
等一下,因为每次输入
set;时,该事件都没有在集合内触发,所以该属性也不起作用? -
是的,所以,你不能走捷径。
-
知道了。我也试过这样做:
public string SomeProp { get; [PropertyChnged] set; }但它什么也没做,对我来说它应该工作是有道理的,对吧? -
永远不要因为不知道某事而感到羞耻。我们每天都在学习。
标签: c#