动态切换控件类型以显示不同的内容类型

时间:2014-05-21 12:55:34

标签: c# wpf xaml

在我的应用程序(Windows 8.1)中,我使用拆分Visual Studio模板。它正在工作,如果我选择一个项目,我可以显示文本内容。

内容与文字,图片,pdf混合在一起。

那么如何根据内容数据动态切换控件类型(例如TextBlock,Image,UserControl)?

如果我得到文本它应该显示在TextBlock中,但如果我得到一个图像(链接)它应该显示在图像控件中。 (也许改变控制类型的方法是错误的,我不知道!?)

我可以在XAML中解决这个问题,还是应该在代码后面进行解决?

我不知道怎么能这样做。有人可以给我一个提示吗?

<Grid x:Name="itemDetailGrid" Margin="0,60,0,50">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <Image Source="{Binding ImagePath}" Grid.Row="1" Margin="0,0,20,0" Width="180" Height="180" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}"/>
            <StackPanel x:Name="itemDetailTitlePanel" Grid.Row="1" Grid.Column="1">
                <TextBlock x:Name="itemTitle" Margin="0,-10,0,0" Text="{Binding Title}" Style="{StaticResource SubheaderTextBlockStyle}"/>
                <TextBlock x:Name="itemSubtitle" Margin="0,0,0,20" Text="{Binding Subtitle}" Style="{StaticResource SubtitleTextBlockStyle}"/>
            </StackPanel>
          <!--  <TextBlock Grid.Row="2" Grid.ColumnSpan="2" Margin="0,20,0,0" Text="{Binding Content}" Style="{StaticResource BodyTextBlockStyle}"/> -->
            <Image Source="{Binding Content}" Grid.ColumnSpan="2" Grid.Row="2" Margin="0,20,0,0"  Stretch="UniformToFill" />

1 个答案:

答案 0 :(得分:0)

您的问题的答案是您使用DataTemplate来定义应在UI中呈现每种数据类型的方式。您需要做的就是为每种不同的数据类型声明DataTemplate

<DataTemplate DataType="{x:Type System:String}">
    <TextBlock Text="{Binding}">
</DataTemplate>
...
<DataTemplate DataType="{x:Type Custom:DataObject}">
    <UserControl DataContext="{Binding}">
</DataTemplate>

如果省略x:Key引用(如上例所示),那么只要遇到某个指定的数据类型,Framework就会自动呈现相关DataTemplate的内容。有关详细信息,请参阅MSDN上的Data Templating Overview页面。