首页新闻找找看学习计划

WPF MVVM使用mvvmlight感觉好啰嗦

0
悬赏园豆:10 [待解决问题]

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的双向绑定就很简约。

屋檐不懂雨的主页 屋檐不懂雨 | 初学一级 | 园豆:92
提问于:2020-01-03 15:13
< >
分享
所有回答(4)
0

问题尖锐奥,插眼

猝不及防 | 园豆:1956 (小虾三级) | 2020-01-03 15:37

我在看aop的时候看到了一种aop的写法:

 [Mixin(typeof(INotifyPropertyChanged))]
 [Aspect(Scope.PerInstance)]
 internal class NotifyAspect : INotifyPropertyChanged
 {
    public event PropertyChangedEventHandler PropertyChanged = (s, e) => { };

    [Advice(Kind.After, Targets = Target.Public | Target.Setter)]
    public void AfterSetter(
        [Argument(Source.Instance)] object source,
        [Argument(Source.Name)] string propName,
        [Argument(Source.Injections)] Attribute[] injections
        )
    {
        PropertyChanged(source, new PropertyChangedEventArgs(propName));

        foreach(var i in injections.OfType<Notify>().ToArray())
            PropertyChanged(source, new PropertyChangedEventArgs(i.NotifyAlso));
    }
}

对应的属性就可以简单些了:

  [Notify(NotifyAlso = nameof(Fullname))]
    public string FirstName
    {
        get; 
        set;
    }

    [Notify(NotifyAlso = nameof(Fullname))]
    public string LastName 
    {
        get; 
        set;
    }
支持(0) 反对(0) 猝不及防 | 园豆:1956 (小虾三级) | 2020-01-14 08:49
0

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

会长 | 园豆:6725 (大侠五级) | 2020-01-03 15:39

只有个别控件有command命令,其他大部分控件都要这样写

支持(0) 反对(0) 屋檐不懂雨 | 园豆:92 (初学一级) | 2020-01-03 16:17
0

Button_Click

日暮青色 | 园豆:416 (菜鸟二级) | 2020-01-04 16:37
0

事件绑定命令确实代码冗余,可以试试自定义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}" />  绑定到当前上下文上。
楚人Leo | 园豆:382 (菜鸟二级) | 2020-01-16 15:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册