網(wǎng)站首頁 編程語言 正文
建立連接
在WPF當中,需要為View與ViewModel建立連接, 我們需要找到View的DataContext, 如下所示:
建立連接的方式
如果你使用了解WPF當中如何綁定DataContext, 你應(yīng)該能想到會有下面這些方式進行:
- 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框架, 標準的ViewModelLocator可能如下所示:
嗯...確實,這些方式都可以建立View-ViewModel關(guān)系。
但是,這一切并不是Prism想表達的內(nèi)容, 甚至不建議你按上面的方式去做, 因為這樣幾乎打破了開發(fā)的所有原則。
(我們把View與ViewModel的關(guān)系編碼的方式固定了下來, 通過靜態(tài)類去維護ViewModel的關(guān)系...)
Prism ViewModelLocator
在Prism當中, 你可以基于命名約定, 便能夠輕松的將View/ViewModel建議關(guān)聯(lián)。如下所示:
假設(shè)你已經(jīng)為項目添加Views/ViewModels文件夾。此時, 你的頁面為ViewA, 則對應(yīng)的ViewModel名稱為 ViewAViewModel。
下面則是錯誤的命名方法:
當遵循了命名規(guī)范后, 是不是意味著就能夠進行自動綁定? 不, 此時還需要在View當中聲明,允許當前View自動裝配ViewModel:
細心的你會發(fā)現(xiàn), 這也就是為什么, 使用VisualStudio Tmeplate Pack創(chuàng)建的空白項目的時候, 為什么項目會為你默認創(chuàng)建Views/ViewModels文件夾。
當然, 任性的我們也可以選擇不遵循這個約定, 盡管它看起來似乎也能夠很好的進行工作...
更改約定
實際的開發(fā)中, 我們可能有些清空無法遵循此規(guī)則, 如下所示,我們定義Controls文件夾放View, ViewModels文件夾放ViewModel:
修改方式:
1.使用ViewModelLocationProvider設(shè)置默認視圖類型指定的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" }); }
原文鏈接:https://www.cnblogs.com/zh7791/p/14109905.html
相關(guān)推薦
- 2022-09-25 注解@Autowired如何自動裝配
- 2023-02-15 Android音視頻開發(fā)只硬件解碼組件MediaCodec講解_Android
- 2022-07-09 JQuery中this的指向詳解_jquery
- 2022-08-23 一文教會你調(diào)整Matplotlib子圖的大小_python
- 2022-12-12 flutter中如何使用和擴展ThemeData實現(xiàn)詳解_Dart
- 2022-03-31 C語言類的雙向鏈表詳解_C 語言
- 2022-04-23 uni-app項目之商品列表的下拉刷新與上拉加載更多
- 2022-10-17 python?文件讀寫和數(shù)據(jù)清洗_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支