2012-03-04 70 views
0

MVVM的新手。我沒有使用任何MVVM框架(WAF/MVVM Light)。我使用Josh Smith的relayCommand類。處理多個表單

了兩種形式,Win_Login(btnCancel和btnNext),其他一個的選擇形式與組合框和兩個按鈕(btnBack,btnNext) - 當如GOOG,MSFT等用戶選擇stockticker

我寫了一個基本骨架查看和ViewModel的登錄和選擇表單。

我想實現的是對succesfull登錄,接近登錄視圖和公開選拔的形式,並點擊(btnBack)應顯示登錄表單again.Windows是辛格爾頓

我設置視圖的DataContext的像

<Window   
    x:Class="Ticker.Win_Login" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Ticker" 
    Title="Ticker-Login" Height="312" Width="394" WindowStartupLocation="CenterScreen" Background="#F9FBF4" > 

<Window.DataContext> 
    <local:Win_LoginViewModel/> 
</Window.DataContext> 

<Grid></Grid 

在Win_LoginViewModel

private void LoginExecute() 
    { 
     if (!CanLoginExecute()) return; 

     try 
     { 
     //how I'll call close the current view 

      //how I'll call selectTicker view 

     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

在Win_SelectTickerViewModel

private Boolean CanBackExecute() 
    { 
     return true; 
    } 

    private void BackExecute() 
    { 
     if (!CanCancelExecute()) 
     { 
      return; 
     } 

    //how I'll implement back here. 
    } 

我真的很感激,如果有人能幫助我與一些簡單的解決方案給出的情況(可能包含一些示例代碼)。

+0

Window類是不好的使用DataTemplateSelector類,以便有鑑於模型中沒有用戶控件代碼這裏。我假定你可以創建兩個用戶控件(一個用戶控件用於一個視圖模型)並且想在它們之間切換。 – vorrtex 2012-03-04 15:22:59

回答

0

我現在不能寫一個完整的解決方案,但我知道它是如何完成的。

在最簡單的情況下,您應該爲視圖模型創建父視圖模型,並將此模型的方法綁定到子視圖模型的命令。

事情是這樣的:

MainViewModel:

public class MainViewModel 
{ 
    // store instances of child view models so that the entered data aren't lost 
    private Win_LoginViewModel _loginViewModel; 
    private Win_SelectTickerViewModel _selectTickerViewModel; 

    private UserControl _currentView; 
    // will be bound to the view and dynamically changed 
    public UserControl CurrentView 
    { 
     get { return _currentView; } 
     set 
     { 
      _currentView = value; 
      RaisePropertyChanged("CurrentView"); 
     } 
    } 

    public void GoToSelectTickerView() 
    { 
     // create _selectTickerViewModel if it is necessary 

     this.CurrentView = new SelectTickerView { DataContext = _selectTickerViewModel }; 
    } 

    public void GoToLoginView() 
    { 
     // create _loginViewModel if it is necessary 

     this.CurrentView = new LoginView { DataContext = _loginViewModel }; 
    } 
} 

SelectTickerViewModel:

public Win_SelectTickerViewModel 
{ 
    private MainViewModel _parentModel; 

    private void BackExecute() 
    { 
     //... 
     _parentModel.GoToLoginView(); 
    } 
} 

而XAML代碼將是這樣的:

<Window x:Class="Ticker.MainWindow" ...> 
    <Window.DataContext> 
     <local:MainViewModel/> 
    </Window.DataContext> 

    <ContentControl Content="{Binding CurrentView}" /> 
</Window> 

您可以改善這種https://stackoverflow.com/a/5310213/427225

您也可以看一下可能的方式來組織家長和孩子視圖模型之間的通信:https://stackoverflow.com/a/8551832/427225