当前位置: 首页 > 编程语言 > C#

WPFCaliburn.Micro和TabControlwithUserControls问题分享

时间:2023-04-10 18:14:38 C#

WPFCaliburn.MicroandTabControlwithUserControlsQuestion它在。我正在尝试使用TabControl在UserControl之间切换(每个选项卡都不同,因此不使用Items)这是细分:我有我的主视图和3个UserControl。Mainview有一个选项卡控件——每个选项卡应显示不同的用户控件。我可以轻松地将tabcontrol对象设置为usercontrol,但它没有绑定到视图模型,只绑定到视图。所以我在我的VM和ActivateItem中使用了Conductor。这是它开始变得奇怪/令人沮丧的地方。应用程序开始时选择了Tab0,但内容是Tab2(最后一个选项卡)。单击任何其他选项卡会为该选项卡加载正确的ViewModel。单击回到Tab0也会加载正确的内容。我如何让它停止?另外,如果切换选项卡没有再次重新初始化视图模型,我真的很喜欢它,清除已经输入的字段。不管怎样,这是我的一些资料来源,我打算把它放在这里,在我弄坏鼠标之前处理其他事情。View:和ViewModel:classMainViewModel:Conductor{RemoteInfoViewModelremoteInfo=newRemoteInfoViewModel();RemoteToolsViewModelremoteTools=newRemoteToolsViewModel();CHRemoteViewModelchRemote=newCHRemoteViewModel();{ActivateItem(remoteInfo);}publicvoidLoadRemoteTools(){ActivateItem(remoteTools);}publicvoidLoadCHRemote(){ActivateItem(chRemote);我可以建议一条不同的路线吗?这是我在主细节场景中成功完成的工作。假设您有一组子视图模型。我会为所有这些项目设置一个标记界面,当然,如果有这样一个跨越所有子视图模型的方法,您可以根据需要添加属性/方法:publicinterfaceIMainScreenTabItem:IScreen{}你可以确定你想要所有子模型两者都是Screen(或者,在嵌套方案的情况下,Conductor)。它使它们具有完整的初始化/激活/停用周期。然后,子视图模型:publicsealedclassChRemoteViewModel:Screen,IMainScreenTabItem{publicChRemoteViewModel(){DisplayName="CHRemote";}}publicsealedclassPcInfoViewModel:Screen,IMainScreenTabItem{publicPcInfoViewModel(){DisplayName="PCInfo";}}publicsealedclassRemoteToolsViewModel:Screen,IMainScreenTabItem{publicRemoteToolsViewModel(){DisplayName="RemoteTools";}}DisplayName将显示为标题文本。密封这些类是一个很好的做法,因为DisplayName是一个虚拟属性,并且在未密封类的构造函数中调用虚拟方法是一个很大的禁忌。然后您可以添加适当的视图并设置您选择注册的IoC容器-您必须将所有子视图模型注册为实现IMainScreenTabItem类,然后:publicclassMainViewModel:Conductor.Collection.OneActive{publicMainViewModel(IEnumerabletabs){项目.AddRange(标签);MainView.xaml只是:它只是工作。如果您的子视图模型具有多个依赖项(例如数据库访问、记录器、验证机制等),这也是一个非常好的和方便的解决方案,现在您可以让IoC完成所有繁重的工作,而不是手动实例化更改它们。但有一件事:选项卡将按照类被注入的顺序放置。如果要控制排序,可以通过传递自定义IComparer或添加一些属性OrderBy或选择IMainScreenTabItem接口,在MainViewModel构造函数中对它们进行排序。默认选择的项目将是“项目列表”中的第一个。另一种选择是让MainViewModel采用三个参数:publicMainViewModel(ChRemoteViewModelchRemoteViewModel,PcInfoViewModelpcInfo,RemoteToolsViewModelremoteTools){//将上面的视图模型以您认为合适的任何顺序添加到`Items`集合中}虽然当您有超过2-3个子视图模型(你可以很容易地得到更多)它很快就会变得混乱。关于“清算”部分。IoC创建的视图模型与一般生命周期相关:它们最多初始化一次(OnInitialize),然后在您每次从OnDeactivate(bool)导航时停用,并在您导航到(OnActivate)时激活。OnDeactivate的bool参数指示视图模型是刚刚停用还是完全“关闭”(例如,当您关闭对话窗口并离开时)。如果完全关闭视图模型,它将在下次显示时重新初始化。这意味着任何绑定数据都将在OnActivate调用之间保留,并且您必须明确清除它。更重要的是,如果您保持对子视图模型的强引用,那么即使您调用OnDeactivate(true)数据仍然存在下次初始化时-这是因为IoC注入视图模型创建一次(除非您注入工厂)作为Func运行,然后根据需要初始化/激活/停用。编辑关于引导程序,我不太确定您使用的是哪种IoC容器。我的示例使用SimpleInjector,但您可以使用示例如Autofac轻松完成相同的操作:publicclassAppBootstrapper:Bootstrapper{privateContainercontainer;//////重写以配置框架并设置您的IoC容器。///protectedoverridevoidConfigure(){container=newContainer();容器.Register();容器.Register();varviewModels=Assembly.GetExecutingAssembly().DefinedTypes.Where(x=>x.GetInterface(typeof(IMainScreenTabItem).Name)!=null&&!x.IsAbstract&&x.IsClass);container.RegisterAll(typeof(IMainScreenTabItem),viewModels);容器.验证();}//////覆盖它以提供IoC特定的实现。//////要定位的服务。要定位的键。//////定位的服务。///protectedoverrideobjectGetInstance(Typeservice,stringkey){if(service==null){vartypeName=Assembly.GetExecutingAssembly().DefinedTypes.Where(x=>x.Name.Contains(key)).选择(x=>x.AssemblyQualifiedName).Single();服务=Type.GetType(类型名称);}返回container.GetInstance(服务);}protectedoverrideIEnumerableGetAllInstances(Typeservice){returncontainer.GetAllInstances(service);}protectedoverridevoidBuildUp(objectinstance){container.InjectProperties(instance);请注意Configure的viewModels注册。以上就是C#学习教程的全部内容:WPFCaliburn.Micro和TabControlwithUserControls。多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: