0

MVVM の新機能。MVVM フレームワーク (WAF/MVVM Light) は使用していません。Josh Smith の relayCommand クラスを使用しています。

2 つのフォーム、Win_Login (btnCancel と btnNext)、もう 1 つはコンボボックスと 2 つのボタン (btnBack、btnNext) を備えた選択フォーム - ユーザーが GOOG、MSFT などの株式ティッカーを選択する場所。

Viewの基本的なスケルトンと 、ログインおよび選択フォーム用のViewModelを作成しました。

私が達成したいのは、succesfull login で、Login ビューを閉じて選択フォームを開き、( btnBack ) をクリックすると loginForm が再び表示されるはずです。Windows はSingletonです。

ビューの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.
    }

誰かが特定のシナリオ(いくつかのサンプルコードを含むpbbly)の簡単な解決策を手伝ってくれれば、本当に感謝しています。

4

1 に答える 1

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>

ビュー モデルにユーザー コントロールがないように、DataTemplateSelector クラスを使用してこのコードを改善できます: https://stackoverflow.com/a/5310213/427225

また、親ビュー モデルと子ビュー モデル間の通信を整理する方法を確認することもできます: https://stackoverflow.com/a/8551832/427225

于 2012-03-04T15:21:19.407 に答える