Caliburn Micro->从多个视图/用户控件/自定义控件组成视图

德鲁

如何在CM管理的窗口中重复使用和组成零件?我发现了有关使用两个UserControl绑定到同一ViewModel的帖子,但是如果我想在同一个窗口中组成多个视图和视图模型,则不会太多。(组成“主视图”的每个视图的视图模型)

我的问题的第一部分将是如何分解组件以供重复使用?如果我在窗口中有两个区域,一个是数据网格,另一个是带有标签和文本框的详细信息视图,这些区域应该位于单独的用户控件,自定义控件或窗口中吗?理想情况下,每个窗口都是独立的,因此可以将它们分开并在其他窗口中使用。

因此,如果将它们分开,我将得到2个视图模型和2个视图。现在假设我要创建3个窗口,一个窗口带有第一个视图,第二个窗口带有第二个视图,第三个窗口带有两个视图。如何使用CM为每个窗口创建窗口并将每个视图连接到其视图模型?从我看到的示例中,我可以看到一个窗口中的大部分视图和视图模型。

克里斯

我想我以前做过类似您要求的事情。我一直在玩其中一款,TabControl目的是为喜欢的游戏托管几种不同的工具。

主要工具是一个项目浏览器,类似于通常的文件浏览器类型的程序,并且类似于上述的Jon。我将解释一些可能与您感兴趣/相关的部分(我删除了一些不太清晰的命名)。

ExplorerView选项卡本质上与Jon所描述的完全相同(希望这是一个好兆头-表示我不疯狂= D)

<UserControl x:Class="ItemsBrowser.Views.ItemsTabView"
<!-- namespaces -->
>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition Width="2*"/>
        </Grid.ColumnDefinitions>
        <ContentControl x:Name="ItemsExplorer" Grid.Column="0" Grid.Row="0" />
        <GridSplitter HorizontalAlignment="Right" VerticalAlignment="Stretch" 
                      ResizeBehavior="PreviousAndNext" Width="4" Grid.Column="1" Background="#FFAAAAAA" />
        <ContentControl x:Name="PanelView" Grid.Column="2" Grid.Row="0" />
    </Grid>   
</UserControl>

关联ViewModel包含另外两个ViewModels,用于组成主浏览器视图:

public class ItemsTabViewModel : Conductor<IScreen>.Collection.AllActive 
{
    public ItemsViewModel ItemsExplorer { get; set; }
    public ExplorerPanelViewModel PanelView { get; set; }

    // Ctor etc.
}

ItemsExplorer承载TreeView式的控制,允许用户浏览各种类别的Item从游戏。它在应用程序的多个位置使用,并由几个不同的控件组成。

ExplorerPanelView是在右手侧上的面板,该变化以显示数的ViewModels,基于什么类型的项目的用户正在观看。用户还可以选择Views在中ViewModel显示的内容之间进行切换ExplorerPanelView

ExplorerPanelView样子:

<UserControl x:Class="MIS_PTBrochure.Views.ExplorerPanelView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:cal="http://www.caliburnproject.org">
    <Grid>
        <ContentControl cal:View.Model="{Binding Path=ActiveItem}" 
                        cal:View.Context="{Binding Path=ActiveItem.State}"
                        Content="Select a folder."/>
    </Grid>
</UserControl>

ExplorerPanelViewModel后面:

public class ExplorerPanelViewModel : Conductor<IScreen>.Collection.OneActive,
    IHandle<ItemSelectedEvent> // More events.
{
    public ItemViewModel ItemInfo { get; set; }
    public CategoryFolderViewModel CategoryFolderInfo { get; set; }

    public ExplorerPanelViewModel()
    {
        // My helper to access the `Caliburn.Micro` EventAggregator.
        EventAggregatorFactory.EventAggregator.Subscribe(this);

        // Other code
    }

    public void Handle(ItemSelectedEvent message)
    {
        // Other code to check active status
            ItemInfo = message.selected;
            ActivateItem(ItemInfo);
    }

    protected override void OnDeactivate(bool close)
    {
        Debug.WriteLine("Deactivated " + this.ToString() + close.ToString());
        if (close) { EventAggregatorFactory.EventAggregator.Unsubscribe(this); }
        base.OnDeactivate(close);
    }

    // Other code
}

我尝试删除了许多不相关的代码。本质上,我再次托管多个ViewModels作为属性(尽管您可以保存一个集合),并在ViewModel我引发了适当的事件时激活相关属性ItemsExplorerViewModel我正在使用Caliburn.Micro EventAggregator处理多个之间的通信ViewModels

从理论上讲,您可以省去属性,而只需激活ViewModels事件本身中引用即可。

关于cal:View.Contextcal:View.Model-我正在使用所有用户来切换可用的不同可用View状态(ViewModel该面板中显示的每个状态都继承自ViewModel具有State属性的基)。

在某些地方,我使用Views弹出一些不同的窗口ViewModels为此,我利用Caliburn.Micro WindowManager官方文档中没有很多有关此内容的信息(最好是搜索Google和CM讨论),这确实可以做到。

如果您看一下Caliburn.Micro.IWindowManager界面,将会看到一些可以从WindowManager实例调用的便捷方法

public interface IWindowManager
{
    bool? ShowDialog(object rootModel, object context = null, IDictionary<string, object> settings = null);
    void ShowPopup(object rootModel, object context = null, IDictionary<string, object> settings = null);
    void ShowWindow(object rootModel, object context = null, IDictionary<string, object> settings = null);
}

因此,要弹出一个新的WindowViewModel你所选择的,我所做的这些方针的东西:

// Some basic Window settings.
dynamic settings = new ExpandoObject();
    settings.Title = "Test Window";
    settings.WindowStartupLocation = WindowStartupLocation.Manual;
    settings.SizeToContent = SizeToContent.Manual;
    settings.Width = 450;
    settings.Height = 300;

    var TestViewModel new TestViewModel();
    WindowManagerFactory.WindowManager.ShowWindow(this.classSearch, null, settings);

Caliburn.Micro应该再次解决您Views的问题ViewModels

希望那里某处有用。我通过几次设计迭代就得出了这种解决方案,因此这可能不是解决其中某些问题的最佳方法。如果有人有建设性的批评,请让我知道= D

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Caliburn Micro,聚焦MV

来自分类Dev

使用Caliburn.Micro附加到多个事件

来自分类Dev

如何为caliburn.micro添加自定义约定?

来自分类Dev

Caliburn.Micro框架中的控件命名约定

来自分类Dev

使用Caliburn Micro从视图模型中的属性名称获取控制

来自分类Dev

添加自定义控件mvvm caliburn

来自分类Dev

使用Caliburn.Micro的视图模型中的气泡事件

来自分类Dev

Simple Injector + Caliburn Micro 2.0,解析视图时出错

来自分类Dev

Caliburn.Micro视图未在弹出窗口中销毁

来自分类Dev

将多个Caliburn.Micro视图模型绑定到同一视图的不同实例

来自分类Dev

Caliburn Micro Datagrid绑定

来自分类Dev

Caliburn Micro发布/订阅

来自分类Dev

带有项目控件的视图模型的Caliburn.Micro绑定列表

来自分类Dev

如何使用Caliburn.Micro将容器绑定到MVVM标准中的列表视图控件?

来自分类Dev

使用Caliburn.Micro重用视图实例

来自分类Dev

使用Caliburn.Micro时用于多个控件的相同方法

来自分类Dev

Caliburn Micro事件在视图/视图模型关闭时

来自分类Dev

Caliburn Micro,动态加载的视图/视图模型

来自分类Dev

Caliburn Micro->从多个视图/用户控件/自定义控件组成视图

来自分类Dev

使用Caliburn.Micro附加到多个事件

来自分类Dev

具有多个ViewModel的Caliburn.micro

来自分类Dev

Caliburn.Micro框架中的控件命名约定

来自分类Dev

添加自定义控件mvvm caliburn

来自分类Dev

Caliburn.Micro不更新用户界面

来自分类Dev

Caliburn Micro自替换视图/视图模型

来自分类Dev

Caliburn Micro不更新用户控件中的依赖项属性

来自分类Dev

Caliburn Micro - 使用 IResult 和渲染视图

来自分类Dev

如何在 MVVM Caliburn.Micro 中绑定用户控件?

来自分类Dev

caliburn micro:MVVM 父视图和父视图的子视图需要停用子视图

Related 相关文章

  1. 1

    Caliburn Micro,聚焦MV

  2. 2

    使用Caliburn.Micro附加到多个事件

  3. 3

    如何为caliburn.micro添加自定义约定?

  4. 4

    Caliburn.Micro框架中的控件命名约定

  5. 5

    使用Caliburn Micro从视图模型中的属性名称获取控制

  6. 6

    添加自定义控件mvvm caliburn

  7. 7

    使用Caliburn.Micro的视图模型中的气泡事件

  8. 8

    Simple Injector + Caliburn Micro 2.0,解析视图时出错

  9. 9

    Caliburn.Micro视图未在弹出窗口中销毁

  10. 10

    将多个Caliburn.Micro视图模型绑定到同一视图的不同实例

  11. 11

    Caliburn Micro Datagrid绑定

  12. 12

    Caliburn Micro发布/订阅

  13. 13

    带有项目控件的视图模型的Caliburn.Micro绑定列表

  14. 14

    如何使用Caliburn.Micro将容器绑定到MVVM标准中的列表视图控件?

  15. 15

    使用Caliburn.Micro重用视图实例

  16. 16

    使用Caliburn.Micro时用于多个控件的相同方法

  17. 17

    Caliburn Micro事件在视图/视图模型关闭时

  18. 18

    Caliburn Micro,动态加载的视图/视图模型

  19. 19

    Caliburn Micro->从多个视图/用户控件/自定义控件组成视图

  20. 20

    使用Caliburn.Micro附加到多个事件

  21. 21

    具有多个ViewModel的Caliburn.micro

  22. 22

    Caliburn.Micro框架中的控件命名约定

  23. 23

    添加自定义控件mvvm caliburn

  24. 24

    Caliburn.Micro不更新用户界面

  25. 25

    Caliburn Micro自替换视图/视图模型

  26. 26

    Caliburn Micro不更新用户控件中的依赖项属性

  27. 27

    Caliburn Micro - 使用 IResult 和渲染视图

  28. 28

    如何在 MVVM Caliburn.Micro 中绑定用户控件?

  29. 29

    caliburn micro:MVVM 父视图和父视图的子视图需要停用子视图

热门标签

归档