【问题标题】:HOWTO avoid hard-coded WPF MVVM property name when passing it as a string parameter in OnPropertyChanged如何在 OnPropertyChanged 中将其作为字符串参数传递时避免硬编码的 WPF MVVM 属性名称
【发布时间】:2019-01-05 13:36:16
【问题描述】:

首先,我使用的是 .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");
   }
}

所以我一直认为是否有任何方法可以避免属性名称被硬编码。

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

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

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

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

【问题讨论】:

  • 请问为什么要使用这么老的框架?
  • 如果您对 Flat Eric 对您的问题的回答不满意,请查看 Mark Gravell 对此问题的回答(注意这不是公认的答案)stackoverflow.com/questions/491429/… 也许它会为您指明正确的方向避免字符串的方向,但我不确定它是否会满足您的性能需求,因为它使用反射和 lambdas。
  • @KlausGütter 这很简单:因为我目前所在的公司已经过时,并且他们已经多年没有更新/迁移他们的应用程序到新的框架,所以现在所有的应用程序都已构建使用这个旧框架,它们需要维护。它们是中型和复杂的应用程序,不容易快速迁移,需要大量时间来分析和迁移它们。也许您在想……“那么为什么不将应用程序迁移到新的 .NET Framework?您还在等什么?”
  • @KlausGütter 因为这里有很多因素需要考虑:我们是一个非常非常小的团队,而且我们每个人每天都要做很多工作,我们非常劳累,所以我们没有时间投资迁移。老板也有不正确的想法:“应用程序正在运行,为什么要迁移?”这是不正确的,很多次我告诉他和团队的其他成员我们现在必须迁移他们,但他们既不倾听也不承认想法(都是借口)所以很难与这样的人合作......
  • @KlausGütter 似乎他们不想发展,他们被利用了。另一个问题是公司的心态:负责招聘的人不想雇佣更多的程序员/分析师。结果是:一个非常非常小的团队,在旧框架中维护了很多应用程序。我们需要更多的程序员,但是……这就是现实。有公司有公司....有老板有老板....情景和情景等等....

标签: c# wpf mvvm properties .net-3.5


【解决方案1】:

如果你受限于 .net 3.5,试试这个:

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

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

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

【讨论】:

  • @user1624552 如果您担心开销,这实际上是一个有效的问题。它显然比纯字符串慢,但通知功能已经是一个拖累。您可以使用性能分析器来查看是否是“热点”。如果经常定期调用它是唯一的问题。从技术上讲,比刷新率更频繁地调用它是没有意义的,因此如果在您的代码中发生这种情况,请考虑将此属性与 UI 刷新率同步,而不是更快。仅在“业务逻辑”代码中保留实际值。
  • 实际的 CPU 时间大约是 notify 函数的 30%,所以还不错。我的电脑每秒可以进行约 50000 次调用,所以这应该没什么大不了的。 :-)
【解决方案2】:

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

OnPropertyChanged(nameof(MyProperty));

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

您需要的只是 Visual Studio 2015(或 2013 与 nuget 包,据我所知)

【讨论】:

  • 对不起,据我所知,我认为你错了,nameof 是在 C# 6 所以 .NET Framework 4.6 和 Visual Studio 2013/2015 中引入的新功能。无论如何,我正在使用 Visual Studio 2008...我忘了说(我已经更新了问题以表明它)。
  • 我用 .Net 3.0 项目进行了测试,它可以工作,但在 VS2008 中无法工作。没错,是在 C# 6 中添加的,但并非所有新功能都需要新的框架版本,有些只需要新的编译器版本,即新的 Visual Studio 版本
  • 是的,你是对的,对不起。我已经检查过了。正如你所说,它是一种语言特性,而不是框架特性,所以在这种情况下,它只取决于 Visual Studio 版本(编译器版本)。
猜你喜欢
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多