Обработка нескольких форм - PullRequest
0 голосов
/ 04 марта 2012

Новое в MVVM.Я не использовал ни одного фреймворка MVVM (WAF / MVVM Light). Я использую класс relayCommand от Джоша Смита.

Получил две формы, Win_Login (btnCancel и btnNext), другую - форму выбора с выпадающим списком и двумя кнопками(btnBack, btnNext) - Там, где пользователь выбирает биржевой макет, например, GOOG, MSFT и т. д.

Я написал базовый скелет View и ViewModel для формы входа и выбора.

Чего я хочу добиться, так это успешного входа в систему, закрыть представления входа в систему и открыть форму выбора, а затем щелкнуть ( 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 с некоторым примером кода).

1 Ответ

0 голосов
/ 04 марта 2012

Я не могу написать полное решение в данный момент, но я знаю, как это можно сделать.

В самом простом сценарии вы должны создать родительскую модель представления как для моделей представления, так и для методов связывания.этой модели для команд моделей дочернего представления.

Примерно так:

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

...