我正在做一个项目,并且它是多余的-我正在尝试完全不带任何代码隐藏。
我有一个名为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
布尔属性触发使用它们中的任何一个时遇到问题。
我将不胜感激任何帮助。
有几种方法可以实现此目的,通常您可以使用DataTemplateSelector
分配给ItemsControlItemTemplateSelector
属性的。
但是,您可以ItemContainerStyle
在ItemsControl的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
属性null
:
<DataTrigger Binding="{Binding Image}" Value="{x:Null}">
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句