WPF MVVM使用mvvmlight感觉好啰嗦

2020-07-11 00:24发布

问题:

1.写一个命令处理函数要写一大堆的花花架子,例如

 1        public ICommand WindowCloseCommand
 2         {
 3             get
 4             {
 5                 return new RelayCommand(() =>
 6                 {
 7                          //这里才是自己的代码,外面嵌套的太罗嗦了
 8                 }
 9                 );
10             }
11         }    

 

2.写Model类

1 private string money;
2 
3 public string Money
4 {
5             get { return money; }
6             set { money = value; RaisePropertyChanged(() => Money); }
7 }

 

3.xaml命令比较臃肿

1 <i:Interaction.Triggers>
2        <i:EventTrigger EventName="MouseMove">
3                 <i:InvokeCommandAction Command="{Binding xxxCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" />
4         </i:EventTrigger>
5 </i:Interaction.Triggers>

 

4.界面涉及复杂的元素操作,例如焦点相关的获取,失去,新开窗体什么的都比较麻烦。有没有那个框架封装度比较高的,能解决这些问题。例如vue的双向绑定就很简约。

回答1:

没错,即使使用了 mvvm 框架,该模式还是显得繁琐,mvvm 模式很重要的优点是单元测试,如果项目小,其实没啥使用的必要,爱怎么写怎么写。

不过还是有解决方法的!

Q:如何消除 Model 中繁琐的属性通知代码?

A:使用 Fody 旗下的 Fody/ropertyChanged

基本使用方法:在 Model 类名上添加  [AddINotifyPropertyChangedInterface]  特性,该类的所有属性便全部拥有了通知功能。

 

Q:如何消除命令模式前后端的繁琐代码?

A:mvvm 框架 Caliburn.Micro 也许能帮你,该框架与 mvvmlight 不同,它基于名称约定,也就是说,如果你有个名为 “GetData” 的按钮,vm 中有个名为 “GetData()” 的方法,那么这个按钮就自动将命令绑定到了 GetData() 方法。

另一个推荐的 mvvm 框架是 Stylet,它是由 Caliburn.Micro 改造而来,提供了更多简化操作。

补充推荐一个 mvvm 框架:Catel,也具有自动映射从模型到视图模型的功能。

 

以上具体使用方法,可以自行搜索教程。



回答2:

问题尖锐奥,插眼



回答3:

MouseMove需要事件转命令,按钮啥的并不需要这么麻烦。我们都没用过什么框架,自己稍微封装了下。



回答4:

Button_Click



回答5:

事件绑定命令确实代码冗余,可以试试自定义Behavior或MarkupExtension,这是源代码:https://github.com/LeoYang-Chuese/wif ,比Blend的方式要简单。

第一种:EventToCommandBehavior。

<Wif.Demo:ListBox x:Name="ListBox" ItemsSource="{Binding ListBoxItems}"> 
<wif:EventToCommandBehavior.EventBindings> 
<Wif:EventBinding Command = "{Binding CustomCommand}" EventName="MouseEnter" /> 
</Wif:EventToCommandBehavior.EventBindings> 
</Wif.Demo:ListBox> 

第二种:EventBindingExtension。

<Rectangle MouseDown="{wif:EventBinding MouseDownCommand}" /> 普通无参数绑定。
<Rectangle MouseDown="{wif:EventBinding Command=MouseDownCommand, CommandParameter=blue}" /> 普通绑定。
<Rectangle MouseDown="{wif:EventBinding Command=MouseDownCommand, CommandParameter=$this.Fill}" /> 绑定到当前控件的属性上。
<Rectangle MouseDown="{wif:EventBinding Command=MouseDownCommand, CommandParameter=$e}" />  绑定到当前上下文上。