第一次用MVVMLight就orz了
WPF纯新手,之前拿WPF当WinForm一样的用过一两次,那时候对WPF是啥完全没有加以了解,就当WPF=WinForm的background code+xaml版的ASP.NET
这次准备开始做一个WPF项目,领导希望xaml和代码尽可能的分离,才找了本《WPF 4 Unleashed》看了下,然后简单了解了下Prism和MVVMLight就准备动手啦~~
貌似stackoverflow上对MVVMLight还比较赞,就准备用这个,结果第一次用就orz了,写出一点初步的心得给组里其他WPF初学者看一下,也请园子里的高手多指教。
■安装相关
我用的安装包,一切安装顺利,结果尝试新建一个MVVMLight Application的时候说项目模板(ProjectForTemplate.csproj) 找不到。
解决办法是到报错那个目录(C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ProjectTemplatesCache\CSharp\Windows\Mvvm\MvvmLight.WPF4.zip)下把MvvmLight.WPF4.csproj重命名就好了-v-
顺便说一下我也下了手动安装的那个zip包,好像文件名是没有问题的,下次尝试手动安装好了
之后是code snippets,好像不会像prop之类的那样有智能感知啊?从code snippets manager那里也确实找到了,在Snippets\CSharp下面,是不是应该挪到Visual C#下面?不知道了。。。求帮助
■ ViewModel相关生成这种代码是要闹哪样啊 囧
throw new NotImplementedException();
// Update bindings, no broadcast
//RaisePropertyChanged(UserIDPropertyName);
// Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
//RaisePropertyChanged(UserIDPropertyName, oldValue, value, true);
我还没有理解所谓broadcast在这里做什么用,是一种类似于总线的设计?但是单从API设计来看我总会觉得这两个方法有一个内部调用关系的,于是我发现这两个方法都可以重载的时候我好惊讶- -
另外为了写个属性弄出这么一堆代码,也没给生成个region神马的看起来实在很头疼。。。就不能参考那个神马NotifyWaver(名字好像更长些?没记住。。。)的做法编译后织入么
■ Messenger相关这个才是我真正想吐槽的地方啊!
为神马Messenger比IMessenger公开的方法多啊!虽然这个也说得过去,但ViewModelBase里的MessengerInstance为神马是IMessenger类型啊!这样的话不是逼着我用Messenger.Default么!提供MessengerInstance有咩用啊!
然后Send方法还可以指定Target。。。我看例子中都是指定了一个View。。。这样ViewModel怎么和View分离啊!囧死了
最后为了一个Navigation要写这样的代码。。。
某ViewModel的某Command
Messenger.Default.Send("XXXX", "NavigationRequest");
某View
, action =>
{
if (action.Equals("XXXX",
StringComparison.InvariantCultureIgnoreCase))
{
_mainFrame.NavigationService.Navigate(
new Uri("/Views/DashBoard.xaml", UriKind.Relative));
}
});
要用一个字符串作"NavigationRequest" 为token。。。而且可以指定token的这个Send方法还不是IMessenger里的。。。
呼,就到这里吧~