WPF框架Prism中ViewModelLocator用法介紹
建立連接
在WPF當(dāng)中,需要為View與ViewModel建立連接, 我們需要找到View的DataContext, 如下所示:

建立連接的方式
如果你使用了解WPF當(dāng)中如何綁定DataContext, 你應(yīng)該能想到會(huì)有下面這些方式進(jìn)行:
- XAML設(shè)置
- Code設(shè)置 (構(gòu)造函數(shù)注入 或 ViewModelLocator)
XAML的方式:
<UserControl.DataContext>
<.../>
</UserControl.DataContext>代碼的方式:
public partial class ViewA : UserControl
{
public ViewA()
{
InitializeComponent();
this.DataContext = null; //設(shè)定
}
}如果你使用過第三方的MVVM框架, 標(biāo)準(zhǔn)的ViewModelLocator可能如下所示:

嗯...確實(shí),這些方式都可以建立View-ViewModel關(guān)系。
但是,這一切并不是Prism想表達(dá)的內(nèi)容, 甚至不建議你按上面的方式去做, 因?yàn)檫@樣幾乎打破了開發(fā)的所有原則。
(我們把View與ViewModel的關(guān)系編碼的方式固定了下來, 通過靜態(tài)類去維護(hù)ViewModel的關(guān)系...)
Prism ViewModelLocator
在Prism當(dāng)中, 你可以基于命名約定, 便能夠輕松的將View/ViewModel建議關(guān)聯(lián)。如下所示:

假設(shè)你已經(jīng)為項(xiàng)目添加Views/ViewModels文件夾。此時(shí), 你的頁面為ViewA, 則對(duì)應(yīng)的ViewModel名稱為 ViewAViewModel。

下面則是錯(cuò)誤的命名方法:

當(dāng)遵循了命名規(guī)范后, 是不是意味著就能夠進(jìn)行自動(dòng)綁定? 不, 此時(shí)還需要在View當(dāng)中聲明,允許當(dāng)前View自動(dòng)裝配ViewModel:

細(xì)心的你會(huì)發(fā)現(xiàn), 這也就是為什么, 使用VisualStudio Tmeplate Pack創(chuàng)建的空白項(xiàng)目的時(shí)候, 為什么項(xiàng)目會(huì)為你默認(rèn)創(chuàng)建Views/ViewModels文件夾。
當(dāng)然, 任性的我們也可以選擇不遵循這個(gè)約定, 盡管它看起來似乎也能夠很好的進(jìn)行工作...
更改約定
實(shí)際的開發(fā)中, 我們可能有些清空無法遵循此規(guī)則, 如下所示,我們定義Controls文件夾放View, ViewModels文件夾放ViewModel:

修改方式:
1.使用ViewModelLocationProvider設(shè)置默認(rèn)視圖類型指定的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" });
}到此這篇關(guān)于WPF框架Prism中ViewModelLocator用法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.Net前臺(tái)調(diào)用后臺(tái)變量的方法
asp.net下前臺(tái)數(shù)據(jù)的調(diào)用輸出方法,需要的朋友可以參考下。2010-07-07
.Net行為型設(shè)計(jì)模式之職責(zé)鏈模式(Chain of Responsibility)
這篇文章介紹了.Net行為型設(shè)計(jì)模式之職責(zé)鏈模式(Chain of Responsibility),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
WPF框架Prism中導(dǎo)航Navigation用法介紹
這篇文章介紹了WPF框架Prism中導(dǎo)航Navigation的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02

