Обработка нескольких форм
Новое в 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