使用MVVM模式做了幾個項目之後,我還在與視圖模型的角色掙扎:MVVM:視圖模型和業務邏輯連接
我所做的過去: 使用模型只是作爲數據容器。 將邏輯放在ViewModel中操縱數據。 (這就是業務邏輯的權利?) Con:邏輯不可重用。
我現在要做的是: 保持ViewModel儘可能薄。 將所有邏輯移入模型層。 只保留ViewModel中的演示邏輯。 Con:如果數據在模型層內發生更改,令UI通知非常痛苦。
所以我給你舉個例子,以使其更清晰的:
場景: 工具來重命名文件。 類: 文件:代表每個文件;規則:包含邏輯如何重命名文件;
如果我遵循以下方法1: 爲文件,規則和視圖 - > RenamerViewModel創建ViewModel。 將所有邏輯放入RenamerViewModel: 包含FileViewModel和RuleViewModel的列表以及前進邏輯。 簡單快捷,但不可重複使用。
如果我遵循方法2: 創建一個新的模型類 - > Renamer,其中包含文件列表,規則和前進的邏輯,以遍歷每個文件並應用每個規則。 爲文件,規則和重命名創建視圖模型。 現在,RenamerViewModel只包含Renamer Model的一個實例,外加兩個ObservableCollections來包裝Renamer的File和Rule List。 但整個邏輯是在Renamer模型中。因此,如果觸發Renamer模型以通過方法調用來操作某些數據,則ViewModel不具有處理數據的線索。 因爲模型不包含任何PropertyChange通知,我會避免這種情況。因此,商業和演示邏輯是分離的,但這使得很難通知用戶界面。
通知事物總是被描述爲ViewModel部分,這就是爲什麼我會在模型中避免它。感覺就像兩次做同樣的事情。 – JDeuker 2013-05-02 13:45:35
@ J.D .:當然,但不是要實施的服務。你的來電。 – Jon 2013-05-02 14:00:37
@Jon:+1表示「永遠不會那樣」。習慣於N層模型的開發人員往往會忘記向VM添加WPF庫引用,以便交還需要組合的複雜對象,如FlowDocument。 – 2013-11-06 19:20:49