来自多个视图/UserControls/CustomControls的组合视图CaliburnMicro->从多个视图/UserControls/CustomControls组合视图如何在CM托管窗口中重用和组合组件?我找到了关于使用两个UserControls绑定到同一个ViewModel的帖子,但如果我想在同一个窗口中创建多个视图和视图模型,就没有那么多了。(每个视图的视图模型构成“主视图”)我问题的第一部分是如何分解组件以供重用?如果我有一个窗口的两个区域,一个是数据网格,另一个是带有标签和文本框的详细视图,这些区域应该是单独的用户控件、自定义控件还是窗口?理想情况下,每一个都可以独立存在,这样它们就可以分开并用于其他窗户。因此,如果将它们分开,我最终会得到2个视图模型和2个视图。现在假设我想创建3个窗口,一个有第一个视图,第二个有第二个视图,第三个有两个视图。我如何使用CM为每个视图创建窗口并将每个视图连接到它的视图模型?从我看过的示例中,我在Windows中看到了我的大部分视图和视图模型。我想我已经做了类似于你之前要求的事情。我一直在玩TabControls之一,打算为我最喜欢的游戏提供几种不同的工具。主要工具是一个项目浏览器,类似于通常的文件浏览器类型程序,类似于Jon上面描述的。我将解释一些可能感兴趣/相关的部分(我删除了一些稍微模糊的命名)。主要的ExplorerView选项卡与Jon所描述的完全相同(希望这是一个好兆头-意味着我没疯=D)>关联的ViewModel包含另外两个构成主要Explorer视图的ViewModels:publicclassItemsTabViewModel:Conductor.Collection。AllActive{公共ItemsViewModelItemsExplorer{得到;放;}publicExplorerPanelViewModelPanelView{get;放;}//Ctor等}ItemsExplorer拥有一个TreeView风格的控件,允许用户在游戏中探索各种类别的项目。它在应用程序的多个地方使用,由几个不同的控件组成。ExplorerPanelView是右侧的面板,它会根据用户正在查看的项目类型更改为显示多个ViewModel。用户还可以选择在ExplorerPanelView显示的ViewModel上的几个不同视图之间切换。ExplorerPanelView看起来像:在ExplorerPanelViewModel后面:publicclassExplorerPanelViewModel:Conductor.Collection.OneActive,IHandle//更多事件。{公共ItemViewModelItemInfo{得到;放;}publicCategoryFolderViewModelCategoryFolderInfo{得到;放;}publicExplorerPanelView(//我的助手访问`Caliburn.Micro`EventAggregator。EventAggregatorFactory.EventAggregator.Subscribe(this);//其他代码}publicvoidHandle(ItemSelectedEventmessage){//检查活动状态的其他代码ItemInfo=message.selected;ActivateItem(ItemInfo);}protectedoverridevoidOnDeactivate(boolclose){Debug.WriteLine("Deactivated"+this.ToString()+close.ToString());if(close){EventAggregatorFactory.EventAggregator.Unsubscribe(this);}base.OnDeactivate(close);}//其他代码}我试图删除很多不相关的代码。基本上我再次将多个ViewModel作为属性托管(尽管你可以有一个集合)并激活相关的当我的ItemsExplorerViewModel引发ItemsExplorerViewModel事件时的ViewModels。我正在使用Caliburn.MicroEventAggregator来处理多个ViewModel之间的通信。理论上,您可以省略该属性,只激活事件本身引用的ViewModel。关于cal:View.Context和cal:View.Model-我正在使用所有这些在可用的不同可用视图状态之间切换(该面板中显示的每个ViewModel都继承自具有State属性的基ViewModel类)。有几个地方我使用了一些相同的Views和ViewModels来弹出不同的窗口。为此,我使用Caliburn.MicroWindowManager。官方文档中没有太多关于它的内容(你最好搜索Google和CM进行讨论),它说的都是在罐头上。如果查看Caliburn.Micro.IWindowManager接口,您会看到一些可以从WindowManager实例调用的便捷方法。公共接口IWindowManager{布尔?ShowDialog(objectrootModel,objectcontext=null,IDictionarysettings=null);voidShowPopup(objectrootModel,objectcontext=null,IDictionarysettings=null);voidShowWindow(objectrootModel,objectcontext=null,IDictionarysettings=null);因此,为了使用您选择的ViewModel弹出一个新窗口,我按照以下几行做了一些事情://SomebasicWindowsettings.dynamicsettings=newExpandoObject();settings.Title="测试窗口";settings.WindowStartupLocation=WindowStartupLocation.Manual;settings.SizeToContent=SizeToContent.Manual;settings.Width=450;设置.Height=300;变种TestViewModel新TestViewModel();WindowManagerFactory.WindowManager.ShowWindow(this.classSearch设置);Caliburn.Micro应该再次将您的视图解析为正确的ViewModel。希望某处有有用的东西。我通过一些设计迭代得出了这个解决方案,所以这可能不是解决其中一些问题的最佳方法。如果有人有任何建设性的批评,请让我知道=D。我不以任何方式声称自己是CM专家,但我已经通过一个简单的“基准浏览器”取得了合理的成功。它使用单个“外壳视图”来组合另外两个视图,每个视图都有自己的ViewModel。外壳视图如下所示:...然后ResultsGraphView和BenchmarkPickerView都如下所示:.........控件...ShellViewModel将其他两个ViewModel公开为属性。然后它们会在构建时自动传递给视图。(Bootstrap不提供任何获取它们的方法。)现在这不太符合您的描述,因为我认为您不能单独使用两个单独的视图作为窗口-我怀疑您最终会得到5个视图:SubViewOne-一个带有第一个视图部分的用户控件SubViewTwo-一个带有第二个视图部分的用户控件JustViewOne-一个只包含SubViewOne的窗口JustViewTwo-一个只包含SubViewTwo的窗口BothViews-一个包含SubViewOne和SubViewTwo的窗口我认为没有办法围绕你不想在另一个窗口中放置另一个窗口的事实,顶级窗口必须是……好吧,一个窗口。希望这会有所帮助,如果您想了解我正在从事的一个小项目的更多详细信息,请告诉我-它远未达到生产质量,尤其是在DI方面,但它可能足以让您入门。以上是C#学习教程:CaliburnMicro->多视图组合视图/UserControls/CustomControls共享的所有内容。如果对你有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络收集,不代表立场,如涉及侵权,请右击联系管理员删除。如需转载请注明出处:
