• 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中就是对一些事件流,数据流的控制了通过对数据,控制可以实现刷新前台数据,命令控制,可以访问业务层,等下层业务等;

  • 相关阅读:
    CCPC长春赛重现
    2016弱校联盟十一专场10.3,BNU52308,大模拟
    2016弱校联盟十一专场10.3,BNU52308,大模拟
    UVA12264 二分最大流,注意pdf的样例是错的
    UVA12264 二分最大流,注意pdf的样例是错的
    UVA1658海军上将,拆点费用流
    UVA1658海军上将,拆点费用流
    angular报错:Please add a @Pipe/@Directive/@Component annotation
    angular 自定义验证器
    ionic 学习笔记
  • 原文地址:https://www.cnblogs.com/weiweiboqi/p/4673431.html
Copyright © 2020-2023  润新知