MVVM的新手,请原谅我的无知。
我认为我正确使用它,但我发现我的ViewModel有太多这些:
RaisePropertyChanged("SomeProperty")
每当我设置一个属性时,我必须提高该死的属性。
我想念我可以去的日子:
public int SomeInteger { get; private set;}
这些天我必须在任何地方坚持使用“RaisePropertyChanged”,否则我的UI不会反映出这些变化:(
我做错了还是其他人因为过多的魔法字符串和旧学校的业主而烦恼?
我应该使用依赖属性吗? (我怀疑这有助于代码膨胀)
尽管存在这些问题,我仍然认为MVVM是要走的路,所以我想这就是它。
答案 0 :(得分:12)
看看这个What is the best or most interesting use of Extension Methods you've seen?。
它描述了我的Model和ViewModel类用于启用以下强类型(无魔术字符串)属性的扩展方法和辅助方法。
private string _name;
public string Name
{
get { return _name; }
set { this.NotifySetProperty(ref _name, value, () => this.Name); }
}
这就像我认为的那样简单。希望它有所帮助。
答案 1 :(得分:7)
您可以使用PostSharp的NotifyPropertyChanged属性。然后你所要做的就是在类上放置一个属性,就是这样。 E.g:
[NotifyPropertyChanged]
public class MyClass
{
public string MyProperty { get; set; }
}
答案 2 :(得分:4)
从不同的角度看待事物是有帮助的:那些不是复杂的.NET属性,而是简化的依赖属性。
WPF中视图模型的可绑定属性与.NET属性不同,而是一种键值存储。如果你想要DependencyObject的轻量级替代品,你有能力实现这个键值存储,只需在setter中调用某些函数 - 实际上并不坏。当然,远非理想,但你的观点肯定是不公平的。
答案 3 :(得分:0)
它不会让你回到干净的代码,但我使用一个简单的扩展方法来获取属性名称,以避免魔术字符串的问题。它还保持代码的可读性,即它明确发生了什么。
扩展方法简单如下:
public static string GetPropertyName(this MethodBase methodBase)
{
return methodBase.Name.Substring(4);
}
这意味着您的属性集对名称更改具有弹性,如下所示:
private string _name;
public string Name
{
get { return _name; }
set
{
name = value;
RaisePropertyChanged(MethodBase.GetCurrentMethod().GetPropertyName());
}
}
我已经写了更多关于这个extension method here的信息,我已经published a matching code snippet here了。
答案 4 :(得分:0)
这将有助于: “某种魔法” 轻松的INotifyPropertyChanged
[http://visualstudiogallery.msdn.microsoft.com/d5cd6aa1-57a5-4aaa-a2be-969c6db7f88a] [1]
作为将其添加到一个属性的示例:
[Magic]
public string Name { get { return _name; } set { _name = value; } }
string _name;
将其添加到所有类属性的另一个示例:
[Magic]
public class MyViewModel: INotifyPropertyChanged
{
public string Name { get; set; }
public string LastName { get; set; }
.....
}