【发布时间】:2015-02-06 21:32:49
【问题描述】:
好的,所以我是(非常)WPF 新手,但使用 Win-forms 已有 13 年,所以没有新手。 我正在编写一个新系统,并决定使用 MVP-VM 模式打破 WPF 的僵局,因为我熟悉 MVP。
现在我还重用了我自己的(复合)架构,该架构在项目中具有 UI 或表示层,与 Presenters 和 View 模型分开。这种方法的主要好处之一是 Presenter 层或 Base 层具有所有表示/命令/控制器逻辑,并且不涉及 UI 问题。主要想法是该层不引用任何 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 以及 View。我有一个控制器,它创建通常将视图的实现传递给演示者的 Presenter。即典型的 Presenter 构造函数是
public ErrorMessagePresenter(IErrorMessageView view)
{
View = view;
View.Presenter = this;
}
控制器代码是这样的
public ErrorMessagePresenter CreateErrorPresenter()
{
return new ErrorMessagePresenter(_viewFactory.CreateErrorMessageView());
}
现在我知道这是相反的,但实际上 UI 层只关心 UI 问题,包括导航在内的所有其他内容都在 Base 层或以下处理..
【问题讨论】: