如果我的 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/