条件ItemsControl.ItemTemplate绑定

时间:2019-02-21 19:38:20

标签: c# wpf mvvm

我正在做一个项目,并且它是多余的-我试图完全在没有代码隐藏的情况下完成它。

我有一个名为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布尔属性确定如何触发它们中的任何一个方面遇到问题。

我将不胜感激。

1 个答案:

答案 0 :(得分:2)

有几种方法可以实现此目的,通常应使用分配给ItemsControl的DataTemplateSelector属性的Item​Template​Selector

但是,您可以在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