首页 > 解决方案 > DataTrigger 在 Style 中没有绑定

问题描述

在我的 Style 中使用数据触发器时遇到问题。

我想打开HasImage我的SelectedLocationInPage. 作为一个我可以读取属性的简单测试,这是有效的:

<UserControl>
    <DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
        <Grid HorizontalAlignment="Stretch">
            <ContentControl Content="{Binding ExamManager}">
                <ContentControl.Resources>
                    <DataTemplate DataType="{x:Type vm:LocationViewModel}">
                        <Button Style="{StaticResource imageLocationButton}">
                            <ContentControl Content="{Binding}"/>
                        </Button>
                    </DataTemplate>
                </ContentControl.Resources>
            </ContentControl>

            <DockPanel Grid.Column="1">
                <Border BorderBrush="Black" BorderThickness="1" Margin="20">
                    <ContentControl Content="{Binding SelectedLocationInPage}">
                        <ContentControl.Style>
                            <Style TargetType="{x:Type ContentControl}">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding HasImage}" FontSize="100"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </ContentControl.Style>
                    </ContentControl>
                </Border>
            </DockPanel>
        </Grid>
    </DockPanel>
</UserControl>

上部内容控件显示单元格网格(考试),当您选择单元格时,该单元格应显示在下部内容控件中。如上所述,在带有或不带有图像的单元格之间进行选择 ( HasImage == true/false) 会在下部内容控件中正确显示“True”或“False”。

所以我采取下一步并尝试根据 的值呈现不同的内容模板,但HasImage我无法让它工作。当我使用下面的代码时,视图只显示默认字符串表示形式(即 的完全限定类型SelectedLocationInPage)。

(我也试过绑定DataContext.HasImage无济于事。另外,我知道我在技术上不需要处理真假——我可以/应该有一个默认值和一个触发器——但我想确保我的一切我试图在同一水平上避免任何混淆,因为我弄清楚了)

<ContentControl Content="{Binding SelectedLocationInPage}">
    <ContentControl.Style>
        <Style TargetType="{x:Type ContentControl}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding HasImage}" Value="True">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock Text="HAS IMAGE" FontSize="100"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding HasImage}" Value="False">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock Text="NO IMAGE" FontSize="100"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

我不确定是否有任何其他代码可以提供帮助(视图模型等),我相信您只需要知道这HasImage是 的 bool 属性SelectedImageInPage,并且在第一个示例中该HasImage属性没有问题。

标签: wpf

解决方案


直接绑定到HasImage仅在当前ContentTemplate具有属性的情况下才有效。ContentControlContentHasImage

被应用的自身的DataContext没有属性。ContentControlStyleHasImage

尝试绑定到Content.HasImage

<TextBlock Text="{Binding Content.HasImage}" FontSize="100"/>

推荐阅读