亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

視圖模型應該如何關閉表單?

視圖模型應該如何關閉表單?

瀟瀟雨雨 2019-07-06 13:04:53
視圖模型應該如何關閉表單?我正在努力學習WPF和MVVM問題,但遇到了一個障礙。這個問題很相似,但不完全一樣。作為這個(處理-對話-在-wpf-與-mvvm)...我有一個使用MVVM模式編寫的“Login”表單。此表單具有一個ViewModel,它保存用戶名和密碼,這些用戶名和密碼使用常規數據綁定到XAML中的視圖。它還有一個“Login”命令,它綁定到表單上的“Login”按鈕,使用普通的數據綁定。當“Login”命令觸發時,它將調用ViewModel中的一個函數,該函數將通過網絡發送數據以登錄。當此函數完成時,有兩個操作:登錄是無效的-我們只是顯示一個MessageBox,一切都很好登錄是有效的,我們需要關閉Login表單并讓它返回true作為它的DialogResult...問題是,ViewModel對實際視圖一無所知,那么它如何關閉視圖并告訴它返回特定的DialogResult呢?我可以在CodeBeback中添加一些代碼,并/或將視圖傳遞到ViewModel,但這似乎會完全擊敗MVVM的全部要點.更新最后,我違反了MVVM模式的“純度”,并讓View發布了一個Closed事件,并公開Close方法。然后,ViewModel只需調用view.Close..視圖僅通過接口已知,并通過IoC容器連接起來,因此不會丟失可測試性或可維護性。這似乎相當愚蠢,被接受的答案是-5票!雖然我很清楚一個人在“純粹”的情況下解決一個問題所得到的美好感覺,但我并不是唯一一個認為200行事件、命令和行為只是為了避免以“模式”和“純潔”為名的單行方法的人是有點可笑的。
查看完整描述

3 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

這里有很多評論討論MVVM的利弊。對我來說,我同意Nir的觀點;這是一個恰當地使用模式的問題,而且MVVM并不總是合適的。人們似乎已經愿意犧牲軟件設計的所有最重要的原則,只是為了使它適合MVVM。

盡管如此.我認為你的案子很適合做一些重構。

在我遇到的大多數情況下,WPF使您能夠在沒有多個Window也許你可以試著用FrameS和PageS而不是Windows與DialogResultS.

就你的情況而言,我的建議是LoginFormViewModel處理LoginCommand如果登錄無效,則將屬性設置為LoginFormViewModel到適當的值(false或者某些枚舉值UserAuthenticationStates.FailedAuthentication)。對于成功的登錄,您也會這樣做(true或其他枚舉值)。然后使用DataTrigger,它響應不同的用戶身份驗證狀態,并且可以使用一個簡單的Setter更改Source的屬性Frame.

讓您的登錄窗口返回DialogResult我想這就是你感到困惑的地方DialogResult實際上是ViewModel的一個屬性。在我使用WPF的有限經驗中,當某些事情感覺不對勁時,通常是因為我在考慮如何在WinForms中做同樣的事情。

希望能幫上忙。


查看完整回答
反對 回復 2019-07-06
  • 3 回答
  • 0 關注
  • 537 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號