如何实现WPF隐式DataTemplate的显式等价效果?
如何不用隐式DataTemplate实现等价的WPF视图匹配效果
使用隐式DataTemplate时,无需为模板设置键,就能让ContentControl自动匹配ViewModel并渲染对应的View,示例代码如下:
<Window.Resources> <DataTemplate DataType="{x:Type viewModel:FriendDetailViewModel}"> <view:FriendDetailView/> </DataTemplate> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width= "200"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <ContentControl Grid.Row="1" Grid.Column="1" Content="{StaticResource FriendDetailViewModel}"> </ContentControl> </Grid>
但使用带x:Key的显式DataTemplate时,若直接将Content绑定到模板资源,ContentControl会显示System.Windows.DataTemplate,无法正常渲染视图,示例代码如下:
<Window.Resources> <DataTemplate x:Key="FriendDetailViewData"> <view:FriendDetailView DataContext="{Binding FriendDetailViewModel}"/> </DataTemplate> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width= "200"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <ContentControl Grid.Row="1" Grid.Column="1" Content="{Binding FriendDetailViewData}"> </ContentControl> </Grid>
解决方法
要实现和隐式DataTemplate等价的效果,需将ContentControl的Content绑定到ViewModel实例,同时通过ContentTemplate指定显式DataTemplate:
<Window.Resources> <DataTemplate x:Key="FriendDetailViewData"> <view:FriendDetailView /> </DataTemplate> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width= "200"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <ContentControl Grid.Row="1" Grid.Column="1" Content="{Binding FriendDetailViewModel}" ContentTemplate="{StaticResource FriendDetailViewData}" /> </Grid>
关键说明
- 无需在显式DataTemplate中手动设置
DataContext:ContentControl会自动将Content属性绑定的ViewModel实例作为模板的DataContext,手动绑定反而会导致上下文匹配错误。 Content属性的作用是提供要渲染的数据(ViewModel),ContentTemplate属性指定渲染该数据所用的模板,两者配合才能正确渲染视图。
内容的提问来源于stack exchange,提问作者aldo
相关产品推荐
相关产品推荐

