C# 可视性取决于绑定值

C# 可视性取决于绑定值,c#,wpf,C#,Wpf,我有一个自定义的工具提示,我正在尝试样式。我有以下资料: <UserControl.ToolTip> <StackPanel> <TextBlock Text="{Binding Path=ToolPrototype.TypeName}" MaxWidth="200" FontWeight="Bold" TextWrapping="Wrap"></TextBlock> <TextBlock Text="

我有一个自定义的工具提示,我正在尝试样式。我有以下资料:

<UserControl.ToolTip>
    <StackPanel>
        <TextBlock Text="{Binding Path=ToolPrototype.TypeName}" MaxWidth="200" FontWeight="Bold" TextWrapping="Wrap"></TextBlock>
        <TextBlock Text="{Binding Path=ToolPrototype.Description}" MaxWidth="200" TextWrapping="Wrap"></TextBlock>
        <TextBlock Text="{Binding Path=ToolPrototype.Note}" MaxWidth="200" FontWeight="Regular" FontStyle="Italic" TextWrapping="Wrap"></TextBlock>
    </StackPanel>
</UserControl.ToolTip>

这很直截了当。标题将是粗体的。说明将采用常规字体,注释将以斜体显示。问题是并非我的所有工具原型都有.Note作为成员(它基本上是空的)。我的一些工具确实包含分配给Note属性的字符串值,但不是全部。因此,在注释为空的情况下,我的工具提示中仍然会有一个空白区域(基本上就像一个空行)。我只想在ToolPrototype实际定义了note属性的情况下包含该行。否则忽略它。所以,我想我要做的是尝试有条件地检查绑定是否存在。。。但也许这不是正确的思考方式。有人能提供一些指导吗

更新

根据ASh的建议,我尝试使用DataTriggers。这是我现在拥有的

<UserControl.ToolTip>
    <StackPanel>
        <TextBlock Text="{Binding Path=ToolPrototype.TypeName}" MaxWidth="200" FontWeight="Bold" TextWrapping="Wrap"></TextBlock>
        <TextBlock Text="{Binding Path=ToolPrototype.Description}" MaxWidth="200" TextWrapping="Wrap"></TextBlock>
        <TextBlock MaxWidth="200" Text="{Binding Path=ToolPrototype.Note}" FontWeight="Regular" FontStyle="Italic" TextWrapping="Wrap">
            <TextBlock.Style>
                <Style>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=ToolPrototype.Note}" Value="{x:Null}">
                            <Setter Property="Visibility" Value="Collapsed"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>
</UserControl.ToolTip>


但是,这不会生成,并且表示成员“可见性”不被识别。有人能指出我的错误吗?

您的
样式
文本块
类型没有关联

因此,WPF不知道
可见性
属性。(因为该属性由
TextBlock
定义)

通过将属性更改为
TextBlock.Visibility
,可以明确地告诉WPF哪个类定义了属性。让我举一个例子:

<UserControl.ToolTip>
    <StackPanel>
        <TextBlock Text="{Binding Path=ToolPrototype.TypeName}" MaxWidth="200" FontWeight="Bold" TextWrapping="Wrap"></TextBlock>
        <TextBlock Text="{Binding Path=ToolPrototype.Description}" MaxWidth="200" TextWrapping="Wrap"></TextBlock>
        <TextBlock MaxWidth="200" Text="{Binding Path=ToolPrototype.Note}" FontWeight="Regular" FontStyle="Italic" TextWrapping="Wrap">
            <TextBlock.Style>
                <Style>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=ToolPrototype.Note}" Value="{x:Null}">
                            <Setter Property="TextBlock.Visibility" Value="Collapsed"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>
</UserControl.ToolTip>


@ASh是对的。如果经常出现这种情况,您还可以编写一个
NullToVisibilityConverter
来保存XAML中的混乱:
我会按照ASh建议的触发方式。习惯了这一点,您就不用为任何事情实现转换器(请注意,有时转换器仍然是最好的解决方案,这取决于您的场景的复杂性),谢谢!但是,我是否在提供的链接中遗漏了一些内容?我似乎看不到任何包含数据触发器的答案。谢谢。愚蠢的错误。