Wpf 这段代码会破坏MVVM吗?
在使用MVVM构建我的第一个项目时,我想知道下面的代码是否破坏了模型 该命令的目的是在两个用户控件(ucDrumStandard和ucDrumStandardList)之间切换。这两个控件共享相同的viewmodel。 此viewmodel继承自包含“ParentContext”的viewmodelbase。 用户控件“存储”在ParentContext.listOfViews中 (为我的VB代码道歉;-)Wpf 这段代码会破坏MVVM吗?,wpf,vb.net,mvvm,Wpf,Vb.net,Mvvm,在使用MVVM构建我的第一个项目时,我想知道下面的代码是否破坏了模型 该命令的目的是在两个用户控件(ucDrumStandard和ucDrumStandardList)之间切换。这两个控件共享相同的viewmodel。 此viewmodel继承自包含“ParentContext”的viewmodelbase。 用户控件“存储”在ParentContext.listOfViews中 (为我的VB代码道歉;-) 在MVVM模式中,ViewModel和View层之间的通信应仅通过绑定和命令完成。Vie
在MVVM模式中,ViewModel和View层之间的通信应仅通过绑定和命令完成。ViewModel代码不应使用框架元素,因此是的,您的代码“破坏”了MVVM模式 我假设您的ParentContext是一个ViewModel类,它应该有一个CurrentView属性,属于“页面”对象的ViewModel层类型 视图层中那些ViewModel对象的渲染应该使用DataTemplate和Bindings完成。我将添加一个示例来说明所有这些 //视图模型
public class AppVM : INotifyPropertyChanged {
//your code...
private PageVM _currentView;
public PageVM CurrentView {
get {return _currentView;}
set {
_currentView = value;
OnPropertyChanged("CurrentView");
}
}
}
public class PageVM : INotifyPropertyChanged {
//your "view" data visible in the UI
}
//XAML
<ContentControl Content="{Binding CurrentView, Mode=OneWay}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type ucDrumStandardVM}">
<ucDrumStandard/>
</DataTemplate>
<DataTemplate DataType="{x:Type ucDrumStandardListVM}">
<ucDrumStandardList/>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
如果您真的想为两个“页面”保留相同的ViewModel对象,则必须使用触发器
<ContentControl Content="{Binding CurrentView, Mode=OneWay}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentView.Uid, Mode=OneWay}" Value="ucDrumStandard">
<Setter Property="ContentTemplate">
<DataTemplate>
<ucDrumStandard/>
</DataTemplate>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding CurrentView.Uid, Mode=OneWay}" Value="ucDrumStandardGrid">
<Setter Property="ContentTemplate">
<DataTemplate>
<ucDrumStandardList/>
</DataTemplate>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Resources>
</ContentControl>
您说:我假设是ViewModel类的ParentContext应该具有“页面”的ViewModel层类型的CurrentView属性对象。谢谢你的回答。我在主视图模型中有一个CurrentView属性。在我主页的XMAL中,我有:无论如何,我必须确定并设置CurrentView的值。我现在的问题是,我该怎么做?我在想,也许我需要一种控制器?确实,你有一个CurrentView属性,但它似乎是UIEElement类型,而不是两个“页面”的Viewmodel类型。当前视图的值将通过命令(例如按钮“切换到页面x”)或Viewmodel对象进行设置。抱歉,我正在使用手机;)
<ContentControl Content="{Binding CurrentView, Mode=OneWay}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentView.Uid, Mode=OneWay}" Value="ucDrumStandard">
<Setter Property="ContentTemplate">
<DataTemplate>
<ucDrumStandard/>
</DataTemplate>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding CurrentView.Uid, Mode=OneWay}" Value="ucDrumStandardGrid">
<Setter Property="ContentTemplate">
<DataTemplate>
<ucDrumStandardList/>
</DataTemplate>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Resources>
</ContentControl>