条件ItemsControl.ItemTemplate绑定

JCode

我正在做一个项目,并且它是多余的-我正在尝试完全不带任何代码隐藏。

我有一个名为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分配给ItemsControlItem​Template​Selector属性的。

但是,您可以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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章