假設我有一個顯示用戶好友列表的應用程序。朋友列表以TabItem形式顯示。用戶必須首先登錄到服務器,以獲取朋友列表。根據狀態在視圖之間切換
我創建了兩個用戶控件,一個用於用戶登錄時,另一個用戶未登錄時。一些僅此行:
UnloggedView.xaml
<UserControl x:Class="UnloggedView" ...>
<TextBlock ...>You need to <Hyperlink Command="{Binding LoginCmd}">
Login</Hyperlink>too see your friends list</TextBlock>
</UserControl>
LoggedView.xaml:
<UserControl x:Class="LoggedView" ...>
...
<ListView ItemSource={Binding Path=friends}">...
</UserControl>
主窗口下面的代碼:
....
<TabItem Header="Friends">
<vw:UnloggedView />
</TabItem>
我相信一切是根據到MVVM主體。 LoginCmd是在ViewModel中實現的DelegateCommand(來自棱鏡)的簡化變體。這兩個視圖都能正常工作,並且隨着列表的填充(異步),通知被觸發並且視圖被更新。我很高興。所以我有兩個問題:第一個問題是如何激發LoginWindow(用戶被提示輸入他的憑據?現在,我只需創建LoginWindow(一個視圖對象)並使用ShowDialog顯示它。看起來好像我在這裏通過直接操縱ViewModel中的UI來打破MVVM的規則。
主要問題是在我用服務器登錄後,什麼是用TabItem替換內容的正確方法LoggedView。根據MVVM原則,ViewModel不應該對View的內部有所瞭解,我在ViewModel中公開IsLogged屬性(它會觸發PropertyChanged通知),但是我應該綁定什麼才能使所有東西發生?我真的不希望ViewModel操縱使用視圖。
感謝
你的解決方案是完整的,很好的。非常感謝。我還探討了DataTemplateSelector,它也是可行的,但最終如您所建議的那樣使用DataTrigger。 – Uri 2012-01-08 18:52:27