【发布时间】:2009-03-24 15:47:40
【问题描述】:
我想在不引用 WPF 程序集的情况下实现 WPF 的 MVVM 模式的 ViewModel 部分。有问题的部分是命令路由,它要求 ViewModel 实现 ICommand 类型的属性,以便命令绑定可以工作。
现在,我可以避免使用ICommand,只需将属性声明为object。一切仍然有效,就是这样。但困扰我的是,我仍然必须声明它们,我真的不想这样做,因为它们感觉就像样板代码。
我的 ViewModel 目前如下所示:
public class HelloWorldViewModel : ViewModel
{
[BoundProperty]
public string Name { get; set; }
[CommandHandler("SayHello")]
public bool CanSayHello()
{
return Name != "" && Name != null;
}
[CommandHandler("SayHello")]
public void SayHello()
{
View.ShowMessage("Hello, {0}!", Name);
}
public object SayHello { get; private set; }
}
CommandHandlerAttribute 支持命令处理程序的运行时发现(Action 和可选的Func<bool>),而BoundPropertyAttribute 确实是一个方面,它将自身注入到属性设置器和致电INotifyPropertyChanged。我通过使用编译时 IL 编织器来实现这一点。
理想情况下,我也想隐含最后一行(SayHello 属性)。如果不是 WPF 的要求,那么将它放在源中是没有意义的。
所以,很自然地,我正在考虑使用CommandHandlerAttribute 方面将必要的IL 注入到类中,并且本质上是在编译后创建属性。这相当困难,尽管一个好的 IL 编织器(例如 PostSharp)可以大大简化它。
在我踏上这段旅程之前,我想听听大家对我的方法的看法。好听吗?有没有更好的办法?你会/怎么做?
【问题讨论】:
标签: c# wpf mvvm postsharp code-injection