国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

WPF MVVM示例講解

2020-01-24 01:34:20
字體:
來源:轉載
供稿:網友

在沒給大家講解wpf mwm示例之前先給大家簡單說下MVVM理論知識:

WPF技術的主要特點是數據驅動UI,所以在使用WPF技術開發的過程中是以數據為核心的,WPF提供了數據綁定機制,當數據發生變化時,WPF會自動發出通知去更新UI。

  我們使用模式,一般是想達到高內聚低耦合。在WPF開發中,經典的編程模式是MVVM,是為WPF量身定做的模式,該模式充分利用了WPF的數據綁定機制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI顯示和邏輯代碼的耦合度,如需要更換界面時,邏輯代碼修改很少,甚至不用修改。與WinForm開發相比,我們一般在后置代碼中會使用控件的名字來操作控件的屬性來更新UI,而在WPF中通常是通過數據綁定來更新UI;在響應用戶操作上,WinForm是通過控件的事件來處理,而WPF可以使用命令綁定的方式來處理,耦合度將降低。

首先MVVM設計模式的結構

Views: 由Window/Page/UserControl等構成,通過DataBinding與ViewModels建立關聯;
ViewModels:由一組命令,可以綁定的屬性,操作邏輯構成;因為View與ViewModel進行了解耦,我們可以對ViewModel進行Unit Test;
Models:可以是實體對象或者Web服務;

下面通過一個簡單的例子,來介紹一些WPF MVVM模式。示例將展示一個圖片瀏覽器,打開圖片,放大/縮小圖片大小。首先項目結構:

UI:

   

 <Grid>  <DockPanel>   <Menu DockPanel.Dock="Top">    <Menu>     <MenuItem Header="_Open" Command="{Binding OpenFileCommand}"/>    </Menu>    <Menu>     <MenuItem Header="_ZoomIn" Command="{Binding ZoomCommand}" CommandParameter="ZoomIn"/>    </Menu>    <Menu>     <MenuItem Header="_ZoomOut" Command="{Binding ZoomCommand}" CommandParameter="ZoomOut"/>    </Menu>    <Menu>     <MenuItem Header="_Normal" Command="{Binding ZoomCommand}" CommandParameter="Normal"/>    </Menu>   </Menu>   <ScrollViewer>    <Image Source="{Binding ImagePath}" Stretch="None">     <Image.LayoutTransform>      <ScaleTransform ScaleX="{Binding Zoom}" ScaleY="{Binding Zoom}"/>     </Image.LayoutTransform>    </Image>   </ScrollViewer>  </DockPanel> </Grid>

ViewModelBase(用來實現修改通知):

  

 public class ViewModelBase : INotifyPropertyChanged {  public event PropertyChangedEventHandler PropertyChanged;  protected virtual void OnPropertyChanged(string propName)  {   if(PropertyChanged!=null)   {    PropertyChanged(this, new PropertyChangedEventArgs(propName));   }  } }

OpenFileCommand:

public class OpenFileCommand : ICommand {  private MainViewModel _data;  public OpenFileCommand(MainViewModel data)  {   _data = data;  }  public event EventHandler CanExecuteChanged;  public bool CanExecute(object parameter)  {   return true;  }  public void Execute(object parameter)  {   OpenFileDialog dialog = new OpenFileDialog() { Filter = "Image Files|*.jpg;*.png;*.bmp;*.gif" };   if(dialog.ShowDialog().GetValueOrDefault())   {    _data.ImagePath = dialog.FileName;   }  }

ZoomCommand:

   

 public enum ZoomType {  ZoomIn = 0,  ZoomOut = 1,  Normal = 2 } public class ZoomCommand : ICommand {  private MainViewModel _data;  public ZoomCommand(MainViewModel data)  {   _data = data;  }  public event EventHandler CanExecuteChanged  {   add { CommandManager.RequerySuggested += value; }   remove { CommandManager.RequerySuggested -= value; }  }  public bool CanExecute(object parameter)  {   return _data.ImagePath != null;  }  public void Execute(object parameter)  {   ZoomType type = (ZoomType)Enum.Parse(typeof(ZoomType), (string)parameter, true);   switch(type)   {    case ZoomType.Normal:     _data.Zoom = 1;     break;    case ZoomType.ZoomIn:     _data.Zoom *= 1.2;     break;    case ZoomType.ZoomOut:     _data.Zoom /= 1.2;     break;   }  } }

MainViewModel:

public class MainViewModel : ViewModelBase {  private string _imagePath;  public string ImagePath  {   get   {    return _imagePath;   }   set   {    if (_imagePath != value)    {     _imagePath = value;     OnPropertyChanged("ImagePath");    }   }  }  private double _zoom = 1.0;  public double Zoom  {   get   {    return _zoom;   }   set   {    if(_zoom != value)    {     _zoom = value;     OnPropertyChanged("Zoom");    }   }  }  private ICommand _openFileCommand;  public ICommand OpenFileCommand  {   get { return _openFileCommand; }  }  private ZoomCommand _zoomCommand;  public ZoomCommand ZoomCommand  {   get { return _zoomCommand; }  }  public MainViewModel()  {   _openFileCommand = new OpenFileCommand(this);   _zoomCommand = new ZoomCommand(this);  } }

下一步我們要做的是將MainViewModel綁定到MainWindow上,我們可以通過下面兩種方式綁定:
1. 直接在MainWindow的Code Behind中進行綁定:
       

 public MainWindow()  {   InitializeComponent();   DataContext = new MainViewModel();  }

2. 在App.xaml后臺代碼中綁定(將App.xaml中StartupUri="MainWindow.xaml"刪除掉):

  public App()  {   MainWindow window = new MainWindow();   window.DataContext = new MainViewModel();   window.Show();  }

運行效果圖如下:

以上就是針對WPF MVVM示例講解的全部內容,并附有效果圖,看著還不錯吧,希望大家能夠喜歡,歡迎提出寶貴意見。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 太白县| 阜阳市| 交口县| 灌南县| 郁南县| 黄大仙区| 河源市| 特克斯县| 杂多县| 孟津县| 体育| 临泽县| 娄底市| 长武县| 同德县| 洪湖市| 常德市| 长沙市| 无棣县| 大名县| 广汉市| 桦南县| 垫江县| 沿河| 湖北省| 白山市| 化州市| 洱源县| 景东| 谢通门县| 务川| 临汾市| 依兰县| 朔州市| 汤原县| 江津市| 吉木乃县| 大宁县| 松原市| 海林市| 临清市|