我正在做一个项目,并且它是多余的-我试图完全在没有代码隐藏的情况下完成它。
我有一个名为MessagePanel的用户控件,该控件用于包装通过TCP连接接收的消息。
消息可以是纯文本或仅图像,并且我的控件旨在使用不同的数据模板来处理这两种消息。
文本模板:
<ItemsControl ItemsSource="{Binding Messages}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Text}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
图片模板:
<ItemsControl ItemsSource="{Binding Messages}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Source="{Binding Image}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我在根据IsImage
布尔属性确定如何触发它们中的任何一个方面遇到问题。
我将不胜感激。
答案 0 :(得分:2)
有几种方法可以实现此目的,通常应使用分配给ItemsControl的DataTemplateSelector
属性的ItemTemplateSelector
。
但是,您可以在ItemsControl的ItemContainerStyle
中使用DataTrigger编写仅XAML解决方案:
<ItemsControl ItemsSource="{Binding Messages}">
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Text}"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsImage}" Value="True">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Image Source="{Binding Image}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
请注意,您可能不需要具有IsImage
属性。 DataTrigger还可以检查Image
的{{1}}属性:
null