Обработка нескольких форм

Новое в MVVM. Я не использовал никакой инфраструктуры MVVM (WAF/MVVM Light) . Я использую класс relayCommand от Josh Smith.

Получил две формы: 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.
    }

Я был бы очень признателен, если бы кто-нибудь мог помочь мне с каким-то простым решением для данного сценария (возможно, с некоторым примером кода)

1 ответ

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

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

Что-то вроде этого:

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, чтобы в модели представления не было пользовательских элементов управления: /questions/46470017/izmenenie-vida-dlya-modeli-predstavleniya/46470053#46470053

Также вы можете посмотреть возможные способы организации связи между моделями родительского и дочернего представлений: /questions/44619753/gde-ya-mogu-razmestit-logiku-dlya-moej-icommand/44619761#44619761

Другие вопросы по тегам