我正在使用MVVM开发功能区WPF应用程序。功能区使用API Fluent Ribbon Control Suite; MVVM框架使用Caliburn Micro,DI使用Ninject。
我观察到的是,当应用程序增长时,用于视图MainView的MainViewModel也在不断增长。第一个问题:是否可以将MainViewModel分成多个VM?或者更确切地说,多个VM控制包含色带的相同MainView ?
第二个问题是在这种情况下:
当用户按功能区中的按钮时,功能区下的区域显示不同的视图,即“ActiveItem”被更改为其他视图,如GlobalDataView或BreakdownDataView等。:
<Grid x:Name="SubView" Background="White">
<ContentControl x:Name="ActiveItem" />
</Grid>
现在假设GlobalDataView被激活(分配到ContentControl中),在视图激活时显示上下文功能区选项卡,如果有一个很好的解决方案,我们假设上下文功能区是VM“ContextualRibbonGlobalDataViewModel” 。此外,GlobalDataView本身也有自己的名为“GlobalDataViewModel”的VM。我的问题是:是否可以组合ContextualRibbonGlobalDataViewModel和GlobalDataViewModel?因为它们都包含非常特定于GlobalDataView的逻辑。
如果Q1不可能,有没有办法让GlobalDataViewModel控制MainView中的上下文功能区?
我当前的方法是MainViewModel(MainView)+ GlobalDataViewModel(GlobalDataView),这样MainViewModel包含GlobalData视图的上下文功能区的所有命令(CM中的操作)。 MainViewModel必须使用中介(CM中的EventAggregator)与GlobalDataViewModel通信。
感谢。
答案 0 :(得分:0)
在我的应用程序中,我有一个“ShellView”Mainmodel,它包含多个子容器。所以这是完全可能的,特别是如果子项在逻辑上相关并与其他部分分开。 学习如何做到这一点有点麻烦,但归结为:
[ImportingConstructor]
public ShellViewModel(IWindowManager windowManager, IEventAggregator events)
{
this.windowManager = windowManager;
this.logger = NLog.LogManager.GetCurrentClassLogger();
this.events = events;
events.Subscribe(this);
}
加载另一个视图:
public async void loadview()
{
this.ActivateItem(new BlaViewModel(this.events, this.windowManager));
//displaying it in a tabcontrol, which is defined in XAML. It would probably work with something else too
var thisView = (ShellView)this.GetView();
thisView.BlaViewM.SelectedItem
}
在新视图中:
public PowerPointViewModel(, IEventAggregator events, IWindowManager windowManager)
{
this.logger = NLog.LogManager.GetCurrentClassLogger();
events.Subscribe(this);
this.events = events;
this.DisplayName = "BLA";
this.windowManager = windowManager;
}
我正在使用事件传递消息,特别是如果需要在单独的视图模型之间进行交互。 从作者那里可以找到一个好的教程: http://devlicio.us/blogs/rob_eisenberg/archive/2010/10/08/caliburn-micro-soup-to-nuts-part-6a-screens-conductors-and-composition.aspx
你能否详细说明你的第二个问题?我不确定我是否理解正确。 但我认为你的功能区中有太多的逻辑。我的色带只是启动事件,这些事件被发送到特定的视图模型,该视图模型可以与数据访问层通信。所以,我的色带也特定于某个Viewmodel。但他们没有必要做太多事情。 Som认为下拉菜单依赖于Viewmodel方法来获取要显示的值,但他们不再做任何事情。