亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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示例講解的全部內容,并附有效果圖,看著還不錯吧,希望大家能夠喜歡,歡迎提出寶貴意見。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
55夜色66夜色国产精品视频| 久久综合电影一区| 亚洲精品mp4| 在线看国产精品| 亚洲福利视频二区| 精品少妇v888av| 97色在线视频观看| 欧美午夜宅男影院在线观看| 在线日韩av观看| 韩剧1988在线观看免费完整版| 久久亚洲综合国产精品99麻豆精品福利| 中文字幕久久亚洲| 国产精品扒开腿做| 欧美www在线| 亚洲天堂av在线免费观看| 亚洲精品一区久久久久久| 国产91色在线| 久久久久久伊人| 国产在线视频不卡| 日本精品久久中文字幕佐佐木| 亚洲的天堂在线中文字幕| 国产精品久久久久久久一区探花| 精品二区三区线观看| 538国产精品一区二区免费视频| 97在线免费观看视频| 欧美精品在线观看91| 2019中文字幕在线| 国产精品高潮在线| 亚洲精品视频二区| 热久久视久久精品18亚洲精品| 2019中文字幕在线免费观看| 国产91色在线|免| 亚洲综合第一页| 中文字幕国产精品| 91牛牛免费视频| 国内精品久久久久影院优| 国产一区二区三区在线播放免费观看| 久久精品中文字幕免费mv| 欧美日韩第一视频| 中文在线资源观看视频网站免费不卡| 91欧美精品成人综合在线观看| 色妞久久福利网| 亚洲丁香久久久| 97视频在线观看免费| 国产在线精品播放| 91精品一区二区| 91亚洲精品视频| 久久色精品视频| 国产精品极品美女在线观看免费| 91高清免费在线观看| 色琪琪综合男人的天堂aⅴ视频| 国产狼人综合免费视频| 国产精品亚洲一区二区三区| 欧美中文字幕视频在线观看| 国产视频欧美视频| 国产日产欧美a一级在线| 欧美日韩国产中文字幕| 日韩成人在线视频| 91a在线视频| 日韩免费视频在线观看| 美女视频黄免费的亚洲男人天堂| 午夜精品福利视频| 国产精品普通话| 国产视频久久久久久久| 日韩av在线网址| 国产精品久久久久不卡| 久久99热这里只有精品国产| 欧美在线观看www| 国产精品av网站| 亚洲精品乱码久久久久久金桔影视| 国产日韩欧美在线视频观看| 日韩高清av在线| 日韩精品欧美国产精品忘忧草| 日本欧美一二三区| 欧美精品电影免费在线观看| 亚洲人永久免费| 91sa在线看| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩成人中文字幕| 亚洲免费一级电影| 日韩美女免费线视频| 日韩有码视频在线| 中文字幕少妇一区二区三区| 成人激情综合网| 亚洲精品91美女久久久久久久| 日本欧美国产在线| 国产精品欧美一区二区| 国产区亚洲区欧美区| 日韩精品视频免费| 欧美日产国产成人免费图片| 另类图片亚洲另类| 亚洲精品av在线播放| 欧美成人精品一区| 欧美中在线观看| 欧美一级视频在线观看| 国产精品免费观看在线| 97国产精品人人爽人人做| 日本高清久久天堂| 中文字幕日韩av综合精品| 色樱桃影院亚洲精品影院| 色综合导航网站| 日韩少妇与小伙激情| 色多多国产成人永久免费网站| 亚洲成年网站在线观看| 91精品国产91久久久久| 国产精品入口免费视频一| 欧美最顶级丰满的aⅴ艳星| 国产精品va在线| 精品国产福利在线| 亚洲欧美综合v| 国产精品久久久久久久久男| 国内精品400部情侣激情| 亚洲欧洲中文天堂| 中文字幕欧美亚洲| 伊人久久男人天堂| 欧美亚洲在线播放| 欧美电影在线观看完整版| 奇米一区二区三区四区久久| 亚洲精品色婷婷福利天堂| 成人欧美一区二区三区在线| 日韩欧美亚洲综合| 成人欧美在线观看| 日韩成人在线视频网站| 亚洲精选在线观看| 亚洲а∨天堂久久精品9966| 欧美孕妇孕交黑巨大网站| 亚洲天堂av在线免费| 国产精品久久久久久久app| 久久久精品免费| 国产精品久久久久久久久久东京| 欧美精品18videos性欧美| 久久久久成人精品| 国产人妖伪娘一区91| 国产精品久久久久久久久久ktv| 亚洲一区二区三区在线视频| 国外成人性视频| 日韩精品黄色网| 亚洲国产精品电影| 国产精品久久久久久久久久| 欧美精品在线免费| 另类天堂视频在线观看| 国产精品视频在线观看| 国产精品成人国产乱一区| 国产98色在线| 97色在线观看免费视频| 亚洲91精品在线观看| 欧美中文字幕视频| 国产97在线|亚洲| 久久久久久久久久久久久久久久久久av| 中文字幕日韩av| 国产精品吴梦梦| 欧美巨大黑人极品精男| 国产一区欧美二区三区| 亚洲午夜精品视频| 69久久夜色精品国产69| 久久视频免费观看| 欧美韩国理论所午夜片917电影| 亚洲国产免费av| 亚洲**2019国产| 中文字幕国内精品| 日韩欧美国产黄色| 亚洲天堂网站在线观看视频| 欧美午夜美女看片| 亚洲视频777|