OK, поэтому я (очень) новичок в WPF, но имею 13 лет с Win-формами, поэтому не новичок. Я пишу новую систему и решил разбить лед с помощью WPF с использованием шаблона MVP-VM, поскольку я знаком с MVP.Использование WPF xaml в событиях MVP-VM или нажмите кнопку
Теперь я также повторно использую свою собственную (составную) архитектуру с интерфейсом пользовательского интерфейса или презентационным проектом в отдельности от моделей презентаций и представлений. Одним из основных преимуществ этого подхода является то, что уровень Presenter или Base имеет всю логику представления/команды/контроллера и не имеет отношения к вопросам пользовательского интерфейса. Главная IDEA заключается в том, что этот слой не имеет никакого отношения к каким-либо сборкам UI, таким как Winforms или WPF.
ВОПРОС: В Xaml у меня есть пункт меню «Выход», который я хочу связать с моделью просмотра. Каждый пример этого, который я видел, использует ICommand .., который размещен в Presentation.core ... модель представления находится на уровне презентации и поэтому не имеет ссылки на Presentation.Core ..
Xaml до сих пор является
<Window x:Class="Homestead.Wpf.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="244" Width="490" xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="23"/>
<RowDefinition Height="*"/>
<RowDefinition Height="23" />
</Grid.RowDefinitions>
<Menu Grid.Row="0">
<MenuItem Header="File">
<MenuItem Header="Exit" />
</MenuItem>
</Menu>
<StatusBar Grid.Row="2" >
<StatusBarItem >
<TextBlock Text="{Binding Path=StatusMessage}" />
</StatusBarItem>
<StatusBarItem HorizontalAlignment="Right" MinWidth="120">
<TextBlock Text="{Binding Path=UserName}" />
</StatusBarItem>
</StatusBar>
</Grid>
модель зрения до сих пор является
public class ShellViewModel : ViewModelBase
{
#region Private Variables
private string _status = string.Empty;
private string _userName;
#endregion
#region Public Properties
public string StatusMessage
{
get { return _status; }
set
{
_status = value;
OnPropertyChanged("StatusMessage");
}
}
public string UserName
{
get { return _userName; }
set
{
_userName = value;
OnPropertyChanged("UserName");
}
}
#endregion
#region Commands
// No reference to ICommand... WTF
#endregion
}
- находится там (без использования кода позади)
- Как это работает с элементами меню, добавленными во время выполнения, забавным является способ.
Должен ли я перепроектировать или сломать шаблон дизайна для использования WPF? пожалуйста, направляйте меня.
Существует одна возможность, которую я могу видеть, и это интерфейс интерфейса ViewModel, а также представление. У меня есть контроллер, который создает презентаторов, которые обычно передают ведущему реализацию представления. Т.е. типичный конструктор Presenter будет
public ErrorMessagePresenter(IErrorMessageView view)
{
View = view;
View.Presenter = this;
}
код контроллера, таким образом,
public ErrorMessagePresenter CreateErrorPresenter()
{
return new ErrorMessagePresenter(_viewFactory.CreateErrorMessageView());
}
теперь я знаю, что это обратная, но буквально слой UI занимается только вопросами пользовательского интерфейса, все остальное, включая навигации обрабатывается в базовом слое или ниже.