如果我的MainWindow具有以下代码:

<Window x:Class="DaveMVVM.View.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:viewModel ="clr-namespace:DaveMVVM.ViewModel"
        xmlns:view="clr-namespace:DaveMVVM.View"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>
            <viewModel:MainWindowViewModel x:Key="Vm" />
        </Grid.Resources>
        <view:MyFirstView />
    </Grid>
</Window>

那么我可以假设我无法从MyFirstView更改 View ...例如,我希望MainWindow只是一个实际上只承载Menu的框架,并且取决于它们从Menu中选择的选项取决于什么显示 View 。

所以,我的两个问题是

1)我认为上述示例由于对 View 进行了硬编码而无法工作,因此我认为是正确的。
2)我必须使用绑定(bind)到MainWindowViewModel的DataTemplates,然后为每个View创建一个DataTemplate吗?

谢谢你。

最佳答案

您可以按照以下步骤进行操作:

您的MainWindowViewModel公开了一个属性CurrentContent。它返回所有 View 模型的通用基本类型:

public ViewModelBase CurrentContent
{
    get { return _currentContent; }
    private set
    {
        if(value == _currentContent)
            return;

        _currentContent = value;
        RaisePropertyChanged("CurrentContent");
    }
}

根据用户的选择,您可以将该属性设置为相应的 View 模型。

您的主 View 将包含一个绑定(bind)到此属性的ContentControl:
<ContentControl Content="{Binding CurrentContent}" />

最后,您的 View (或单独的资源字典)将必须包含每个可能的内容 View 模型的数据模板:
<DataTemplate DataType="{x:Type MyFirstViewModel}">
    <view:MyFirstView />
</DataTemplate>
<DataTemplate DataType="{x:Type MySecondViewModel}">
    <view:MySecondView />
</DataTemplate>

关于.net - 在MVVM中更改 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15091090/

10-17 02:33