代码之家  ›  专栏  ›  技术社区  ›  Willy

如何在OnPropertyChanged中将WPF MVVM属性名作为字符串参数传递时避免硬编码

  •  0
  • Willy  · 技术社区  · 6 年前

    首先,我使用的是.NET Framework 3.5 c_3.0和Visual Studio 2008。

    这么说……在WPF应用程序中使用MVVM模式时,我总是使用视图模型属性绑定到视图中的对象。当从集合实现调用OnPropertyChanged时,我总是将属性的名称硬编码为字符串。

    private string _myProperty;
    public string MyProperty
    {
       get 
       {
          return _myProperty;
       }
    
       set
       {
          if (_myProperty == value) return;
          _myProperty = value;
    
          OnPropertyChanged("MyProperty");
       }
    }
    

    所以我一直认为,如果有任何方法可以避免对属性名进行硬编码。

    我知道有一些方法,如使用所解释的名称 here here 但这仅在C 6.0(.NET Framework 4.6及更高版本)中可用。

    还存在callermembername属性,如所述 here here 但它还是被发布了,并且只在C 5.0(.NET Framework 4.5)和更高版本中可用。

    因此,我使用的是.NET Framework 3.5 c_3.0,因此我不能使用这种方法。

    那么,在将属性名作为参数输入传递给onPropertyChanged方法时,如何避免对其进行硬编码呢?我想要一个不影响性能的解决方案。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Petr    6 年前

    如果受.NET 3.5限制,请尝试以下操作:

    Get the property name used in a Lambda Expression in .NET 3.5

    假设属性周围有一个类,这是一个使用示例 GetPropertyName(this.MyProperty)

    它需要 使用system.linq.expressions; 使用系统。反射; 两个都在那儿

        2
  •  0
  •   Flat Eric    6 年前

    你可以使用 nameof 运算符,独立于使用的框架。 这是一个 语言功能 而不是 框架功能

    OnPropertyChanged(nameof(MyProperty));
    

    这将有效,因为编译器在将此表达式转换为MSIL代码时将其转换为字符串。

    你所需要的只是Visual Studio 2015(据我所知,2013年有一个Nuget软件包)