将多个ViewModel用于RibbonWindow(带或不带Caliburn Micro)

时间:2013-11-22 07:40:37

标签: c# wpf mvvm ribbon caliburn.micro

我正在使用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通信。

感谢。

1 个答案:

答案 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方法来获取要显示的值,但他们不再做任何事情。