1)假设“执行”是某种业务逻辑,那么在模型类中使用它似乎是完全有效的。与验证同上。事实上,这可能是一个给定的,因为你正在寻找所有的业务逻辑和验证在一个地方。然后,该模型可能(可能)在将来重新使用,例如,如果您决定在现有模型之上开发基于Web的系统。事实上,我前一段时间是once asked a similar question。
就我个人而言,我认为拥有一个“丰富”的模型类是很好的,包括实现INotifyPropertyChanged
的属性,使其“具有约束力”。这是完全可以接受的,因为这个接口不在UI相关的框架名称空间(System.ComponentModel)中。为了方便起见,我甚至将ICommand属性包含在我的模型中,尽管它取决于您是多少“纯粹主义者”,模糊了模型定义和视图模型之间的界限。这导致你的第二个问题 - 通过拥有这样一个模型,它可以通过VM属性公开模型直接绑定到视图。
很多WPF开发人员似乎都编写基本上是模型类的镜像映像的VM类(包含所有与之相关的映射代码),但包括诸如INPC属性和ICommands之类的内容。这是我(个人)从未见过的大量开销。同样,关于如何使用模型和虚拟机,似乎有两个“阵营”,可能在某种程度上取决于应用程序需要如何“分层”。这很大程度上取决于个人偏好,而且像许多开发人员的挑战一样,我认为不存在正确或错误的方法。
关于3),是否要单击TreeView中的项目,导致在应用程序中的其他位置显示视图?我假设你正在使用依赖注入框架? AFAIK棱镜区域经理需要这一点,我不知道如何在没有DI框架的情况下使用区域管理器。
首先,您需要定义在一个区域中显示该视图,例如: -
<ContentControl Regions:RegionManager.RegionName="MyRegionName" />
要显示的区域的视图使用棱镜区域经理: -
_regionManager.RequestNavigate("MyViewName", "MyRegionName");
当您使用DI框架注册视图时,将分配视图名称,例如这是如何在温莎城堡完成: -
Container.Register(Component.For<MyView>().ImplementedBy<MyView>().LifeStyle.Transient.Named("MyViewName"));
希望这会让你在你的路上。 Prism导航有很多,尤其是让你的头脑看到生命周期。另外,通过导航视图的虚拟机来实现INavigationAware
以便它可以对事件作出反应通常是有用的。被导航到/从。
编辑(基于OP编辑):
你还没有说,该地区是在同一个视图树视图。如果是这样,那么你可以在没有棱镜导航的情况下实现这一点。 “主” VM(涉及到TreeView的观点)可能使当前选定规则的虚拟机,你可以绑定到ContentControl中(当然是一个INotifyPropertyChanged的属性!):
<ContentControl Content="{Binding SelectedRule}" />
然后,它只是一个案例该规则的虚拟机设置的DataTemplates: -
<DataTemplate DateType="{x:Type XRuleViewModel}">
... XAML ...
</DataTemplate>
由于TreeView的选择变化,ContentControl中会结合相应的规则VM,以及相应的DataTemplate将呈现所需的内容。
如果区域是在单独的视图中,那么您将需要使用棱镜导航。这里的问题是你需要导航的视图名称,但是你的“主”(TreeView)虚拟机不知道视图,只有规则虚拟机。一个简单的选项可能是在规则虚拟机上拥有一个公开相关视图名称的属性。如果您更喜欢纯粹主义者,并且希望将这些知识保留在虚拟机之外,那么您可以实现一种机制,将所有规则虚拟机与其相应的视图名称(例如,在应用程序启动期间)一起注册。这可以像Dictionary
一样简单。在TreeView中选择规则VM时,您只需查找在RequestNavigate()
调用中使用的相应视图名称即可。
感谢您的回答,但我仍然无法获得积分。 3.我知道区域和导航到View使用相同的技术,但问题是,我如何指示我的视图显示基于TreeView选定项目的特定ViewModel。是的,我在棱镜中使用MEF DI。 –
@FSX,所以你想显示一个特定的视图,取决于你点击了哪个treeview项目?这个视图在哪里出现 - 作为与树视图相同的窗口内的内容,还是其他内容? –
看到我上面编辑的问题更多的细节和澄清 –