第一次用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相关

生成这种代码是要闹哪样啊 囧

                // Remove one of the two calls below
                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

            Messenger.Default.Register<string>(this"NavigationRequest"
                                               , action =>
                                                     {
                                                         if (action.Equals("XXXX",
                                                                           StringComparison.InvariantCultureIgnoreCase))
                                                         {
                                                             _mainFrame.NavigationService.Navigate(
                                                                 new Uri("/Views/DashBoard.xaml", UriKind.Relative));
                                                         }
                                                     });

要用一个字符串作"NavigationRequest" 为token。。。而且可以指定token的这个Send方法还不是IMessenger里的。。。 

 

呼,就到这里吧~ 

 

posted @ 2012-01-12 17:52 jiaxingseng 阅读(...) 评论(...) 编辑 收藏