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);
}

因此,为了弹出一个Window带有ViewModel您选择的选项的新内容,我按照以下方式进行了操作:

// 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->从多个视图/用户控件/自定义控件组成视图

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用Caliburn.Micro重用视图实例

来自分类Dev

Caliburn Micro - 使用 IResult 和渲染视图

来自分类Dev

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

来自分类Dev

具有多个ViewModel的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

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Caliburn Micro Datagrid绑定

来自分类Dev

Caliburn Micro发布/订阅

来自分类Dev

Caliburn Micro,聚焦MV

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Caliburn.Micro不更新用户界面

来自分类Dev

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

来自分类Dev

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

来自分类Dev

添加自定义控件mvvm caliburn

来自分类Dev

添加自定义控件mvvm caliburn

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

    使用Caliburn.Micro重用视图实例

  5. 5

    Caliburn Micro - 使用 IResult 和渲染视图

  6. 6

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

  7. 7

    具有多个ViewModel的Caliburn.micro

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

    Caliburn Micro Datagrid绑定

  19. 19

    Caliburn Micro发布/订阅

  20. 20

    Caliburn Micro,聚焦MV

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

    Caliburn.Micro不更新用户界面

  25. 25

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

  26. 26

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

  27. 27

    添加自定义控件mvvm caliburn

  28. 28

    添加自定义控件mvvm caliburn

  29. 29

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

热门标签

归档