【问题标题】:call PropertyChange with public member, not string C#使用公共成员调用 PropertyChange,而不是字符串 C#
【发布时间】:2021-05-23 21:50:06
【问题描述】:

我在网上四处看了看,无法轻松找到我正在寻找的解决方案。部分原因可能是我不确定要搜索的术语。

我想知道有没有办法像这样使用属性成员名称来调用 PropertyChanged 事件...

    private string height;
    public string Height
    {
        get { return name; }
        set
        {
            Set(ref height, value);
            RaisePropertyChanged( ()=> Name);
        }
    }

而不是使用可以在这里看到的实际字符串..

    private string height;
    public string Height
    {
        get { return name; }
        set
        {
            Set(ref height, value);
            RaisePropertyChanged("Name");
        }
    }

引发事件

protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

我已尝试解决此问题,但无法得出结论。我知道某处有一些方法,我相信有更现代的方法可以做到这一点。 2016 年!!

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    由于您似乎使用的是 C# 6,因此您可以使用 nameof 运算符,该运算符在编译时解析引用属性的名称,并将字符串传递给您的方法。

    RaisePropertyChanged(nameof(Name));
    

    如果需要使用较早的C#编译器,可以通过lambda表达式解析属性名;这就是实体框架为它的Include 操作符所做的。你可以定义一个GetPropertyName 实用方法(参见example),然后像这样调用它:

    RaisePropertyChanged(GetPropertyName(() => Name));
    

    【讨论】:

    • 你会如何在 C#4 和 C#5 中做到这一点。请保留上述答案
    • 只是出于好奇,是什么让它看起来像是 C# 6?
    • @ScottChamberlain:有多种方法可以实现GetPropertyName;我引用的那个没有参数。但是您的观点对于传递给Include 的表达式有效。
    • @JokerMartini:?. 空条件运算符(在 PropertyChanged?.Invoke 中)也在 C# 6 中引入。
    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多