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

HOWTO avoid hard-coded WPF MVVM property name when passing it as a string parameter in OnPropertyChanged

首先,我使用的是 .NET Framework 3.5 C# 3.0 和 Visual Studio 2008。

话虽如此...在 WPF 应用程序中使用 MVVM 模式时,我总是使用视图模型属性绑定到视图中的对象。从 set 实现调用 OnPropertyChanged 时,我总是将 属性 的名称硬编码为字符串。

private string _myProperty;
public string MyProperty
{
   get 
   {
      return _myProperty;
   }

   set
   {
      if (_myProperty == value) return;
      _myProperty = value;

      OnPropertyChanged("MyProperty");
   }
}

所以我一直在想有没有办法避免属性名字被硬编码

我知道有使用 nameof 等方法,如解释的那样 and here 但这仅在 C# 6.0(.NET Framework 4.6 及更高版本)中可用。

还存在 CallerMemberName 属性,如 here and here 所述,但它再次发布并且仅在 C# 5.0 (.NET Framework 4.5) 及更高版本中可用。

所以我使用的是 .NET Framework 3.5 C# 3.0,因此我不能使用这种方法。

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

您可以使用 nameof 运算符,独立于所使用的框架。 它是 语言功能 而不是 框架功能

OnPropertyChanged(nameof(MyProperty));

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

你只需要 Visual Studio 2015(或据我所知,带有 nuget 包的 2013)

如果您受到 .net 3.5 的限制,试试这个:

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

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

需要 使用 System.Linq.Expressions; 使用 System.Reflection; 两者似乎都存在