Pro mvvm讀書筆記mvvm中的VM

1、構建ViewModels設計模式

設計模式的其中一個目標就是抽象構造一個給出指定類型的對象或者實現指定類型的接口的過程。須要把類給客戶端,讓客戶端去使用,可是要隱藏類是具體的實現細節。併發

1.1The Applicationapp

在View中有個一個App,實現Application這個文件能夠用來管理ViewModels。mvvm

xaml:ide

<Application x:Class="MvvmWpfApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModel="clrnamespace:
MvvmWpfApp.ViewModel;assembly=MvvmWpfApp.ViewModel"
Startup="Application_Startup">
<Application.Resources>
<viewModel:ApplicationViewModel x:Key="applicationViewModel" />
</Application.Resources>
</Application>this

cs:spa

public partial class App : Application
{
private ApplicationViewModel _appViewModel;
private void Application_Startup(object sender, StartupEventArgs e)
{
_appViewModel = Resources["applicationViewModel"] as ApplicationViewModel;
if(_appViewModel != null)
{
_appViewModel.Startup();
}
}
}線程

1.2The Main Window設計

namespace MvvmWpfApp { //經過ApplicationViewModel來獲取一個MainViewModel //從而賦給MainWindow.DataContext;
    public partial class App :Application { ApplicationViewModel _appViewModel; private void Application_Startup(object sender, StartupEventArgs e) { _appViewModel = Resources["applicationViewModel"] as ApplicationViewModel; if (_appViewModel != null) { _appViewModel.Startup(); MainViewModel mainViewModel = _appViewModel.CreateMainViewModel(); MainWindow mainWindow = new MainWindow(); mainWindow.DataContext = mainViewModel; this.MainWindow = mainWindow; this.MainWindow.Show(); } } } }

1.3併發處理code

dispatchobject把system.object實例綁定到dispatcher上,意味着只有dispatcher創造的線程能夠訪問這個對象。wpf一般有兩個線程,一個用於呈 現,一個用於處理UI和程序的代碼。後者不止一個職責,在點擊按鈕事件代碼裏面System.Threading.Thread.Sleep(10000),若是在移動UI,那麼UI是不會動的。由於線程處於休眠狀態了。處理UI移動的線程和程序代碼用的是同一個線程。一般若是model或者是ViewModel接受到的不是UI線程的事件,會出現InvalidOperationExpcetion.

2、避免在viewmodel中出現調用view中的類。

當使用mvvm時,可能會有種狀況是,當一個點擊菜單按鈕,要彈出另外一個窗體,此時最好不要去直接new一個窗體而破壞mvvm的模式,能夠使用接口:

 

public interface IFilePathProvider { string GetLoadPath(); string GetSavePath(); } public MainWindowViewModel(IFilePathProvider filePathFinder) { _filePathFinder = filePathFinder; } private void Load() { string loadFilePath = _filePathFinder.GetLoadPath(); if (loadFilePath != null) { // The user has selected a file to open
 } } private void Save() { string saveFilePath = _filePathFinder.GetSavePath(); if(saveFilePath != null) { // The user has selected a file to save
 } } public class FilePathProvider : IFilePathProvider { public string GetLoadPath() { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "XML files (*.xml)|*.xml"; string filePath = null; bool? dialogResult = ofd.ShowDialog(); if(dialogResult.HasValue && dialogResult.Value) { filePath = ofd.FileName; } return filePath; } public string GetSavePath() { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "XML files (*.xml)|*.xml"; string filePath = null; bool? dialogResult = sfd.ShowDialog(); if (dialogResult.HasValue && dialogResult.Value) { filePath = sfd.FileName; } return filePath; } }
相關文章
相關標籤/搜索