Wpf 这段代码会破坏MVVM吗?

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构建我的第一个项目时,我想知道下面的代码是否破坏了模型

该命令的目的是在两个用户控件(ucDrumStandard和ucDrumStandardList)之间切换。这两个控件共享相同的viewmodel。 此viewmodel继承自包含“ParentContext”的viewmodelbase。 用户控件“存储”在ParentContext.listOfViews中

(为我的VB代码道歉;-)


在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>