WPF框架Prism中ViewModelLocator用法介紹
建立連接
在WPF當中,需要為View與ViewModel建立連接, 我們需要找到View的DataContext, 如下所示:
建立連接的方式
如果你使用瞭解WPF當中如何綁定DataContext, 你應該能想到會有下面這些方式進行:
- XAML設置
- Code設置 (構造函數註入 或 ViewModelLocator)
XAML的方式:
<UserControl.DataContext> <.../> </UserControl.DataContext>
代碼的方式:
public partial class ViewA : UserControl { public ViewA() { InitializeComponent(); this.DataContext = null; //設定 } }
如果你使用過第三方的MVVM框架, 標準的ViewModelLocator可能如下所示:
嗯…確實,這些方式都可以建立View-ViewModel關系。
但是,這一切並不是Prism想表達的內容, 甚至不建議你按上面的方式去做, 因為這樣幾乎打破瞭開發的所有原則。
(我們把View與ViewModel的關系編碼的方式固定瞭下來, 通過靜態類去維護ViewModel的關系…)
Prism ViewModelLocator
在Prism當中, 你可以基於命名約定, 便能夠輕松的將View/ViewModel建議關聯。如下所示:
假設你已經為項目添加Views/ViewModels文件夾。此時, 你的頁面為ViewA, 則對應的ViewModel名稱為 ViewAViewModel。
下面則是錯誤的命名方法:
當遵循瞭命名規范後, 是不是意味著就能夠進行自動綁定? 不, 此時還需要在View當中聲明,允許當前View自動裝配ViewModel:
細心的你會發現, 這也就是為什麼, 使用VisualStudio Tmeplate Pack創建的空白項目的時候, 為什麼項目會為你默認創建Views/ViewModels文件夾。
當然, 任性的我們也可以選擇不遵循這個約定, 盡管它看起來似乎也能夠很好的進行工作…
更改約定
實際的開發中, 我們可能有些清空無法遵循此規則, 如下所示,我們定義Controls文件夾放View, ViewModels文件夾放ViewModel:
修改方式:
1.使用ViewModelLocationProvider設置默認視圖類型指定的ViewModel。
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) => { var viewName = viewType.FullName; var assemblyName = viewType.Assembly.FullName; var vmName = $"{viewName.Replace("Controls", "ViewModels")}ViewModel, {assemblyName}"; return Type.GetType(vmName); });
該代碼的最終意思就是,將原有的View命名控件命名改成瞭符合約定的命名。
2.使用ViewModelLocationProvider指定View與ViewModel的類型。
public void RegisterTypes(IContainerRegistry containerRegistry) { ViewModelLocationProvider.Register<ControlA, ControlAViewModel>(); //ViewModelLocationProvider.Register<ControlA>(() => new ControlAViewModel() { Text = "Hello from Factory" }); }
到此這篇關於WPF框架Prism中ViewModelLocator用法的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- WPF框架Prism中導航Navigation用法介紹
- c# WPF實現Windows資源管理器(附源碼)
- c# WPF如何實現滾動顯示的TextBlock
- csgo最新s1mple準星參數介紹 s1mple的同款參數是什麼
- .NET Core配置連接字符串和獲取數據庫上下文實例