我已经设置了一个MVVM框架来在视图之间切换。为适应设计,主窗口包含一个选项卡控制器,根据需要显示相应的页面。当用户按下按钮时,其中一个内部页面将发生更改。以下是该设置的可视化表示:
我将一个名为
我想要的是在不依赖数据上下文的情况下更改数据模板。
![该设置的可视化表示](https://istack.dev59.com/Hf44E.webp)
Presenter
的视图模型设置为StudentView
的数据上下文,以处理在StudentOverview
中引发的按钮事件。那样可以工作,但当我想切换视图时,我必须设置一个特定类型的新数据上下文。但由于Presenter
是我的数据上下文,所以切换它会删除按钮的功能。我想要的是在不依赖数据上下文的情况下更改数据模板。
StudentView.xaml
<Page {...}>
<Page.DataContext>
<viewModels:Presenter/>
</Page.DataContext>
<Page.Resources>
<DataTemplate x:Key="Overview" DataType="{x:Type models:StudentOverviewModel}">
<local:StudentOverview/>
</DataTemplate>
<DataTemplate x:Key="Add" DataType="{x:Type models:StudentAddModel}">
<local:AddStudentControl/>
</DataTemplate>
</Page.Resources>
<ContentPresenter Content="{Binding}"/>
</Page>
StudentView.xaml.cs
public partial class StudentView : Page
{
public StudentView()
{
InitializeComponent();
// This switches the view but disables the button
this.DataContext = new StudentOverviewModel();
if (this.DataContext is Presenter presenter)
{
presenter.PropertyChanged += (object o, PropertyChangedEventArgs e) =>
{
// This switches the view but disables the button
this.DataContext = new StudentAddModel();
};
}
}
}
StudentOverviewModel
,它们都继承自相同的基类。使用基类作为变量名,并公开其中一个实例或另一个实例。视图可以决定是否要有单独的模板,但您可能希望为每种类型制作一个模板。| 当然,这可能是那些罕见情况之一,其中按钮实际上是一个仅限于查看的东西,而不是ViewModel应该关心的东西。 - Christopher