WPF MVVM
- 什么是MVVM
- WPF為何使用MVVM機制
- WPFMVVM 的實現手段
- INotifyPropertyChanged
- ?數據綁定的源端通知??
- 原理 PropertyChanged事件
- 雙向綁定的完整條件
- 常見疑惑問題
什么是MVVM
翻譯全稱就是 model-view-viewmodel 3部分內容
-
以wpf的概念角度來解釋就是 數據庫數據源模型----xmal UI視圖----DataContext?? Viewmodel使用模型承載方式
-
以技術點的角度來解釋就是通過 UI的依賴屬性 - binding-ViewModel 數據之間 雙向綁定
UI控件內容變動可以作用于viewmodel,viewmodel模型內容變動也可以作用于UI控件內容顯示
WPF為何使用MVVM機制
- 職責分離??
??View??:僅負責 UI 呈現,通過 XAML 綁定依賴屬性。
??ViewModel??:處理業務邏輯,通過 INotifyPropertyChanged 驅動數據流。
??Model??:封裝數據結構和業務規則。 - ??可測試性與維護性??
ViewModel 獨立于 UI,便于單元測試。
樣式與邏輯解耦,支持設計師與開發者并行工作
WPFMVVM 的實現手段
在 WPF 中,??依賴屬性??、??數據綁定??和 ??INotifyPropertyChanged?? 是支撐 MVVM(Model-View-ViewModel)設計模式的三大核心
- 依賴屬性與 View 的綁定??
??自定義控件??:通過依賴屬性定義控件行為(如 NumericBox.Value),并綁定到 ViewModel 屬性。
??數據模板??:在控件模板中使用 TemplateBinding 關聯依賴屬性與模板元素。 - ??INotifyPropertyChanged 與 ViewModel 的綁定??
??數據驅動 UI??:ViewModel 的 CLR 屬性通過 INotifyPropertyChanged 實現雙向綁定,例如用戶輸入實時同步到數據源。
??工具輔助??:使用 Fody 庫的 [ImplementPropertyChanged] 特性自動生成屬性變更代碼,減少樣板代碼。 - ??數據綁定引擎的協作??
??綁定模式??:
??單向綁定??(OneWay):依賴屬性監聽 ViewModel 屬性變化。
??雙向綁定??(TwoWay):依賴屬性與 ViewModel 屬性互相更新,例如 TextBox.Text 與 ViewModel.InputText。
??驗證與轉換??:通過 IValueConverter 和 ValidationRule 實現數據格式轉換與輸入驗證
INotifyPropertyChanged
?數據綁定的源端通知??
??ViewModel 的職責??:ViewModel 中的 CLR 屬性需實現 INotifyPropertyChanged,以便在值變更時通過 PropertyChanged 事件通知 UI 更新
public class ViewModel : INotifyPropertyChanged {private string _userName;public string UserName {get => _userName;set { _userName = value; OnPropertyChanged(nameof(UserName)); }}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}<TextBox Text="{Binding UserName, Mode=TwoWay}" />
原理 PropertyChanged事件
- INotifyPropertyChanged 是一個接口,定義了一個 PropertyChanged 事件
- 當 ViewModel 中的屬性值發生變化時,觸發 PropertyChanged 事件,并傳遞屬性名稱。
- WPF 的綁定引擎會監聽此事件,并根據屬性名稱更新對應的 UI 元素
雙向綁定的完整條件
- 目標屬性是依賴屬性??(如 TextBox.Text)。
- 源屬性實現 INotifyPropertyChanged??(ViewModel 屬性)。
- ??顯式設置 Mode=TwoWay??(除非依賴目標屬性默認支持雙向)。
- ??更新觸發時機??:通過 UpdateSourceTrigger 控制同步時機(如 PropertyChanged 或 LostFocus)
常見疑惑問題
- 如果沒有用到INotifyPropertyChanged,即使binding 設置了 twoway 也無法viewmodel變更后 作用UI顯示
- 綁定不更新
可能原因:
未正確調用 OnPropertyChanged。
屬性名稱拼寫錯誤(使用 nameof 避免)。
未啟用 Mode=TwoWay(如需要從 View 更新到 ViewModel) - 目前DataContext??是通過=this的寫法 來表現數據源的,無法使用mvvm 所以為什么推薦使用 viewmodel的寫法來使用,DataContext = this 的適用場景??:僅適用于原型驗證或極小規模工具,不推薦生產環境使用
- 在 WPF 中,若綁定模式設置為 OneWay,且 ViewModel 實現了 INotifyPropertyChanged 接口,??數據源的變更會觸發 UI 更新??,但 UI 的修改不會反向同步到數據源