F 與 WPF 之多語言實現MVVM(二)

2022-03-05 14:33:44 字數 1831 閱讀 8302

f#wpf實現mvvm之二

這個示例主要是:計算乙個員工的工資:

乙個人的工資= 工作時間(月) × 月工資 + 福利

當工作時間(月)、月工資、福利中任意乙個發生改變的時候,自動計算

乙個人的工資。當然,在這些元素改變時,計算工資之前,需要對這些元素進行驗證,確保使用者的輸入是正確的,同時對錯誤的輸入進行提示。

最終的示例執行如下:

mode層實現:personmodel

這個類只含有工作時間,名字,月工資,福利這幾個屬性。因此採用隱式類的實現更好。並給月工資,福利,工作時間新增相應的單位。

viewmodel層:personviewmodelpresonediteviewmodel

這個類繫結到view層,要實現:inotifypropertychanged介面,當相應屬性發生改變時同繫結的介面控制項進行同步。這次採用類定義的顯示語法,實現inotifypropertychanged介面時,需要先定義乙個event<_> 型別的字段:

然後實現該介面,並用屬性屬性進行標記:

由於需要對繫結的屬性,進行資料驗證,所以當然是選擇讓personviewmodel類實現idataerrorinfo介面。也有其他的資料驗證的方法,如利用資料繫結異常來驗證…..

現在有乙個問題是,什麼時候對繫結到view層控制項的屬性,進行驗證確保使用者的輸入是正確的。當然,可以在屬性的set(value)函式中進行賦值之前進行驗證,這時候就有乙個問題,使得驗證部分的功能散步在這些函式中。更好的實現方法是,將所有需要的驗證實現為乙個函式,進行統一的驗證。當propertychanged事件觸發的時候,便進行資料驗證。怎麼實現呢?就是新增對propertychanged事件的訂閱,在這裡處理資料驗證。由於f#中對於介面的實現,相當於c#中顯示介面實現。因此,必須轉換為介面,才能呼叫propertychanged函式。

為實現對這些員工的列表管理,所以實現personediteviewmodel類,這裡有乙個問題是:如何監視列表listbox的selecteditem改變。有兩種解決辦法,第一中,也是我之前常用的一種,在view層中,直接繫結到listbox的selecteditem 選項,這也是比較簡單的一種。第二中辦法是,使用listcollectionview作為listbox的資料上下文,從而可以在viewmodel層中,實現listcollectionview 的selectedchanged事件,間接得到listbox的selectedchanged事件。

view層:

這裡沒有什麼特別的,只要看我附加的原始碼,看看就清楚明白了。只是這裡在樣式中使用datatemplate,這裡需要注意點。

persondemo.rar

WPF 多語言實現

原文 wpf 多語言實現 很多國際化的程式都提供了多語言的選項,這樣方便不同國家的使用者更方便的使用軟體。這篇部落格中將介紹在wpf中實現多語言的方式。方式一,使用wpf動態資源的方式實現。先簡單介紹下staticresource和dynamicresource,這兩者的區別在於動態資源改變後會實時...

WPF 多語言實現

原文 wpf 多語言實現 很多國際化的程式都提供了多語言的選項,這樣方便不同國家的使用者更方便的使用軟體。這篇部落格中將介紹在wpf中實現多語言的方式。方式一,使用wpf動態資源的方式實現。先簡單介紹下staticresource和dynamicresource,這兩者的區別在於動態資源改變後會實時...

WPF 多語言實現

很多國際化的程式都提供了多語言的選項,這樣方便不同國家的使用者更方便的使用軟體。這篇部落格中將介紹在wpf中實現多語言的方式。方式一,使用wpf動態資源的方式實現。先簡單介紹下staticresource和dynamicresource,這兩者的區別在於動態資源改變後會實時的體現出來,而靜態資源只載...