以最好的方式这样做会像这样:
<ContentControl>
<ContentControl.ContentTemplate>
<DataTemplate>
<local:CarDetails />
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
后面的代码:
private void btnMore_Click(object sender, RoutedEventArgs e)
{
CarDetailsViewModel c = new CarDetailsViewModel();
(this.Parent as ContentControl).Content = c;
}
理想的情况下,该车的细节视图模型应该是绑定到内容控件的内容父视图模型的属性:
<ContentControl
Content="{Binding SelectedCarDetails}"
>
<ContentControl.ContentTemplate>
<DataTemplate>
<local:CarDetails />
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
SelectedCarDetails
会由父视图模型进行更新,和/或通过在ListBox或ListView选择, 管他呢。
如果你想用不同类型的用户控件来替代,可以考虑使用隐含数据模板:
<ContentControl>
<ContentControl.Resources>
<DataTemplate DataType="{x:Type models:CarDetailsViewModel}">
<local:CarDetails />
</DataTemplate>
<DataTemplate DataType="{x:Type models:BikeDetailsViewModel}">
<local:BikeDetails />
</DataTemplate>
<DataTemplate DataType="{x:Type models:BoatDetailsViewModel}">
<local:BoatDetails />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
那些可以在用户控件的资源来定义,或以任何父母/祖父母的资源/等等。元素放在同一个XAML文件中。如果您为其提供任何这些视图模型类型的内容,它将自动使用相应的数据模板。