程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> WPF采用MVVM模式(綁定:純前台、命令:觸發器綁定命令),wpfmvvm

WPF采用MVVM模式(綁定:純前台、命令:觸發器綁定命令),wpfmvvm

編輯:C#入門知識

WPF采用MVVM模式(綁定:純前台、命令:觸發器綁定命令),wpfmvvm


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中就是對一些事件流,數據流的控制了通過對數據,控制可以實現刷新前台數據,命令控制,可以訪問業務層,等下層業務等;

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved