2016-09-02 69 views
1

我使用MVVM模式構建我的第一個WPF應用程序。使用MVVM模式的WPF swtich視圖無導航視圖

該應用程序以登錄視圖開頭,其中包含一個登錄按鈕。

當我點擊登錄按鈕,它執行的ICommandLoginViewModel如果登錄succeded是從服務器獲得響應。

(我建立一個基於WCF和WPF使用用戶憑據聊天)

*我想實現的是:如果登錄成功,則會切換到註冊視圖

(我知道這沒有任何意義,但它只是用於測試視圖切換)

到目前爲止,我一直在通過按鈕唸叨導航。你的理解並不是我的目標。

所有我想要的是驗證用戶,然後,裝入聊天視圖(這我沒有還,所以這就是爲什麼我mentiond在註冊查看犯規任何意義)

我有一個主窗口XAML代碼僅包含內容控制爲了切換視圖withing網格:

<Grid> 
    <ContentControl Name="mainWindowContent" Content="{Binding CurrentView}"></ContentControl> 
    </Grid> 

主窗口視圖模型是MainWinowViewModel僅包含一個ViewModelBase命名CurrentView個ICommand使得每次CurrentView切換到不同的視圖模型:

public class MainWindowViewModel 
{ 
    // simplified properties 
    public ViewModelBase CurrentView { get; set; } 
    public ICommand ViewLoginCommand { get; } 
    public ICommand ViewSignUpCommand{ get; } 
    public MainWindowViewModel() 
    { 
     ViewLoginCommand =new MyCommand(SetCurrentViewToLoginViewModel); 
     ViewSignUpCommand = new MyCommand(SetCurrentViewToSignUpViewModel); 
     CurrentView = new LoginViewModel(); 
    } 
    private void SetCurrentViewToLoginViewModel() 
    { 
     CurrentView = new LoginViewModel(); 
    } 
    private void SetCurrentViewToSignUpViewModel() 
    { 
     CurrentView = new SignUpViewModel(); 
    } 
} 

我分配的DataContext到MainWindowViewModel在MainWindow.CS

所有正確的模板放在App.xaml文件中,瓦特爲每個視圖模型:

<Application.Resources> 

    <DataTemplate DataType="{x:Type local:LoginViewModel}"> 
     <Views:LoginView /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type local:SignUpViewModel}"> 
     <Views:SignUpView /> 
    </DataTemplate> 

</Application.Resources> 

同樣,我想主窗口到在一個時間僅呈現1視圖不具有導航視圖一邊。

我的問題:

我如何作出這樣一旦登錄成功,將CurrentView將變爲SignUpViewModel。

我錯過了什麼嗎?我的架構是否正確?你會做任何不同的事情嗎?

我看到它的方式,它只能happpen如果不知何故LoginViewModel內,登錄成功後,它會在DataContext的執行ViewSignUpCommand 這沒有意義並不起作用。

我看不出它是如何結合在一起的。 Thx在前面爲您提供幫助!

順便說一句,請原諒我的英語。如果需要其他內容(細節等)以便看到大圖,請通知我。

+0

是的,您需要執行該命令以在需要時從ViewModel切換視圖:按照您的要求「在登錄成功後」。爲什麼它沒有意義?你沒有展示這一點的實現,所以你不能聲稱它不工作...... –

回答

1

您正在通過一個命令更改CurrentView,但視圖並不知道有關更改而未通知。這是通過實現INotifyPropertyChanged接口完成的。

我通常從ViewModelBase派生每個viewmodel類。 ViewModelBase實現INotifyPropertyChanged。在線查看示例以瞭解此類實現。

您應該結束了,像這樣:

public class MainWindowViewModel:ViewModelBase 
{ 
     private ViewModelBase _CurrentView; //ViewModelBase or any common class,or interface of both types of views. 
     private ViewModelBase CurrentView 
     { 
      get 
      { 
       return _CurrentView; 
      } 
      set 
      { 
       if(_CurrentView != value) 
       { 
        _CurrentView = value; 
        OnPropertyChanged(); 
       } 
      } 
     } 
} 

,如果你不想用可重複使用的ViewModelBase類打擾,那麼你可以簡單地實現對MainWindowViewModel INotifyPropertyChanged的。

http://www.c-sharpcorner.com/uploadfile/0b73e1/mvvm-model-view-viewmodel-introduction-part-3/爲例。