.net - 更改 MVVM 中的 View

标签 .net mvvm

如果我的 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 的 DataTemplate,然后为每个 View 创建一个 DataTemplate?

谢谢你。

最佳答案

你可以这样做:

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

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

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

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

您的主视图将包含 ContentControl绑定(bind)到这个属性:
<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/

相关文章:

wpf - 尽管属性值正在更新,但在数据绑定(bind)属性的设置 block 中没有命中断点(和额外代码)

.net - 混淆混合 .NET DLL 的最佳产品

c# - asp.net 4.6 MVC 5 的 future

android - 存储库之间的通信 -> 查看模型 -> Activity

c# - Windows 8 Windows 商店应用程序中的中继命令

wpf - 绑定(bind) OnwayToSource 未按预期工作 - 有什么替代方案?

c# - 如何使用 WPF 和 MVVM 添加带有标题和内容的 TabItem

c# - 可收集的动态程序集中的静态字段访问缺乏性能

c# - Redis Pub/Sub 不发布消息

c# - .net 中可以读取的文件的最大大小