WPF采用MVVM模式(绑定:纯前台、命令:触发器绑定命令)

MVVM绑定

view-viewModel-model,模型介绍省略,就是创建类,添加字段封装属性。注:控件的绑定只能绑定到属性上,不能绑定到字段上;

接下来就是代码

(view):

 1 <Window x:Class="WpfBing.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:vm="clr-namespace:WpfBing"
 5         xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
 6         Title="MainWindow" Height="350" Width="525">
 7     <Grid>
 8         <Grid.DataContext>
 9             <vm:ViewModel/>
10         </Grid.DataContext>
11         <TextBox Text="{Binding Name,UpdateSourceTrigger=PropertyChanged}"  Width="150" Height="30">
12             <i:Interaction.Triggers>
13                 <i:EventTrigger EventName="TextChanged">
14                     <i:InvokeCommandAction Command="{Binding NameChanged}" />
15                 </i:EventTrigger>
16             </i:Interaction.Triggers>
17         </TextBox>
18         <Button Content="测试" Command="{Binding UpdateData}" Width="150" Height="40" HorizontalAlignment="Right">
19         </Button>
20     </Grid>
21 </Window>

说明:

 xmlns:vm="clr-namespace:WpfBing"添加对命名空间的引用,主要是让前台页面能够寻找到viewmodel的命名空间;
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 添加wpf的命名控件引用,主要是用来提供使用该命名空间中的触发器绑定命令
该类的下载链接为:System.Windows.Interactivity
<Grid.DataContext>   <vm:ViewModel/> </Grid.DataContext> 数据源绑定,将该空间按的数据源绑定为vm空间下的ViewModel对象上;注:纯前台绑定的关键
 <i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged"> <i:InvokeCommandAction Command="{Binding NameChanged}" /> </i:EventTrigger> </i:Interaction.Triggers>
通过触发器实现对控件事件的命令绑定,该代码需要添加System.Windows.Interactivity.dll的引用

(BaseClass):

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Diagnostics;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 using System.Windows.Input;
 8 
 9 namespace WpfBing
10 {
11     public class RelayCommand : ICommand
12     {
13         #region 字段
14         readonly Func<Boolean> _canExecute;
15         readonly Action _execute;
16         #endregion
17 
18         #region 构造函数
19         public RelayCommand(Action execute)
20             : this(execute, null)
21         {
22         }
23 
24         public RelayCommand(Action execute, Func<Boolean> canExecute)
25         {
26             if (execute == null)
27                 throw new ArgumentNullException("execute");
28             _execute = execute;
29             _canExecute = canExecute;
30         }
31         #endregion
32 
33         #region ICommand的成员
34         public event EventHandler CanExecuteChanged
35         {
36             add
37             {
38 
39                 if (_canExecute != null)
40                     CommandManager.RequerySuggested += value;
41             }
42             remove
43             {
44 
45                 if (_canExecute != null)
46                     CommandManager.RequerySuggested -= value;
47             }
48         }
49 
50         [DebuggerStepThrough]
51         public Boolean CanExecute(Object parameter)
52         {
53             return _canExecute == null ? true : _canExecute();
54         }
55 
56         public void Execute(Object parameter)
57         {
58             _execute();
59         }
60         #endregion
61     }
62 }

说明:该段代码主要实现ICommand命令,实现该命令接口,通过委托调用调用ViewModel中相应的方法;

ICommand主要有两个方法,Excute,CanExcute,一个是调用的实现方法,一个是判断是否执行该调用方法;

注:功能上可以用来控制按钮或其他,控件状态是否可用

(viewmodel):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace WpfBing
{
    public class ViewModel:INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;

        public void Notify(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }

        }
        private string name = "测试数据";

        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                Notify("Name");
            }
        }
        void UpdateArtistNameExecute()
        {
            this.Name = "中孝介";
        }

        bool CanUpdateArtistNameExecute()
        {
            return true;
        }
        public ICommand UpdateData { get { return new RelayCommand(UpdateArtistNameExecute, CanUpdateArtistNameExecute); } }
        public ICommand NameChanged { get { return new RelayCommand(NameChang); } }

        private void NameChang()
        {
            string na = Name;
        }
    }
}

说明:viewmodel中就是对一些事件流,数据流的控制了通过对数据,控制可以实现刷新前台数据,命令控制,可以访问业务层,等下层业务等;

原文地址:https://www.cnblogs.com/weiweiboqi/p/4673431.html