我在使用用户控件实现MVVM时遇到问题。
我有一个基于MVVM的应用程序。
在其中一个视图(它是一个用户控件)中,我在左侧有一个菜单,在右侧有内容。内容根据菜单而变化。 我试图通过用户控件来实现MVVM,但是我不知道如何。
这是我尝试过的方法,但是没有用:
<UserControl x:Class="PoS.Views.OptionsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:PoS.Views"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<DataTemplate x:Name="SettingsTemplate" DataType="{x:Type viewmodels:SettingsViewModel}">
<views:SettingsView DataContext="{Binding}" />
</DataTemplate>
</UserControl.Resources>
<Grid>
</Grid>
</UserControl>
答案 0 :(得分:0)
说实话,我认为您需要先倒带一下并阅读有关MVVM的好书,然后再继续。 Gary McLean Hall的Pro WPF and Silverlight MVVM
是一个很好的起点。
为回答您的问题,我假设此用户控件的DataContext指向您的MainViewModel
。右侧的内容需要在主视图模型中具有相应的属性,例如:
private ViewModelBase _CurrentPage;
public ViewModelBase CurrentPage
{
get { return this._CurrentPage; }
set
{
if (this._CurrentPage != value)
{
this._CurrentPage = value;
RaisePropertyChanged(() => this.CurrentPage);
}
}
}
然后,您创建一堆“页面”或继承ViewModelBase
的东西,即Page1ViewModel
,Page2ViewModel
,SettingsViewModel
等。然后创建一个ContentControl
并将其内容绑定到该属性:
<ContentControl Content="{Binding CurrentPage}" />
因此,现在,如果您的视图模型执行的操作类似于CurrentPage = new SettingsViewModel()
,则ContentControl
将使用您声明为该类型的DataTemplate的内容(即类型为views:SettingsView
的控件)填充。如果将属性分配给其他内容,则SettingsView
将被销毁,并由新类型的DataTemplate替换。
在上面的示例中,只有SettingsViewModel / SettingsView可以使用,因为这就是您创建的DataTemplate的全部;为了使其正常工作,您需要为所创建的每个ViewModel / View对类型创建一个单独的DataTemplate。