如何在 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;
两者似乎都存在
首先,我使用的是 .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 等方法,如解释的那样
还存在 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; 两者似乎都存在