C# 有条件地将Textblock作为链接

C# 有条件地将Textblock作为链接,c#,wpf,xaml,hyperlink,C#,Wpf,Xaml,Hyperlink,我有一个带有文本属性的标签绑定到一个类: <TextBlock Visibility="Hidden" TextTrimming="WordEllipsis" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Text="{Binding DisplayText}" TextWrapping="Wrap" FontSize="10"></TextBlock> 如果该DisplayText是链接,则应使用

我有一个带有文本属性的标签绑定到一个类:

 <TextBlock Visibility="Hidden" TextTrimming="WordEllipsis" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Text="{Binding DisplayText}" TextWrapping="Wrap" FontSize="10"></TextBlock>

如果该
DisplayText
是链接,则应使用超链接。我绑定到的类还提供了
Uri
和布尔
isLink
。我尝试在
Textblock
中放置
Hyperlink
元素,并将其
NavigateUri
设置为类中的
Uri
,但这对我不起作用。
有人对此有干净的解决方案吗?

您可以使用这两个控件,并根据
isLink
属性更改其可见性

<Grid>
    <TextBlock>
        <Hyperlink NavigateUri="{Binding Uri}"
                   RequestNavigate="Hyperlink_RequestNavigate">
            <TextBlock Text="{Binding DisplayText}"/>
        </Hyperlink>
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Setter Property="Visibility" Value="Visible"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsLink}" Value="False">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    <TextBlock Text="{Binding DisplayText}">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Setter Property="Visibility" Value="Visible"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsLink}" Value="True">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
</Grid>

我认为可以根据属性绑定模板

 <ContentControl>
                <ContentControl.Style>
                    <Style TargetType="ContentControl">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsLink}" Value="True">
                                <Setter Property="ContentTemplate"  >
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock>
                                                 <Hyperlink  NavigateUri="{Binding DataContext.Url, RelativeSource={RelativeSource Mode=FindAncestor,      
                        AncestorType= ContentControl} }">
                                                    <TextBlock Text="{Binding DataContext.DisplayText, RelativeSource={RelativeSource Mode=FindAncestor,      
                        AncestorType=ContentControl} }"/>
                                                </Hyperlink>
                                            </TextBlock>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding IsLink}" Value="False">
                                <Setter Property="ContentTemplate" >
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding DataContext.DisplayText,RelativeSource={RelativeSource Mode=FindAncestor,      
                        AncestorType=ContentControl} }"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>


如果isLink为false,则链接仍有蓝色下划线,即使isLink为true,也会显示两个文本块。它们位于列表框的Datatemplate中这一事实不应该影响它,对吗?事实上,这正是问题所在。
ListBox
中每个项目的
DataContext
ListBox.ItemsSource
列表中的相应元素。这就是绑定不起作用的原因,它绑定到列表项的isLink,witch没有isLink属性。我说清楚了?要解决此问题,请将绑定更改为类似于
binding=“{binding RelativeSource={RelativeSource AncestorType=ListBox},Path=DataContext.isLink}”
ListBox数据源绑定到为每个项提供“DisplayText”和“isLink”的类的可观察集合。您尝试过更改绑定吗?当您将集合绑定到
项控件的
项源时,通过
数据模板创建的每个接口项将自动将相应集合项设置为
数据上下文。例如,假设您的VM类中有一个
ObservableCollectionPoints
属性。在这种情况下,如果将
ItemsSource
属性绑定到
Points
属性,则
DataTemplate
DataContext
将是一个点,而不是VM类。
 <ContentControl>
                <ContentControl.Style>
                    <Style TargetType="ContentControl">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsLink}" Value="True">
                                <Setter Property="ContentTemplate"  >
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock>
                                                 <Hyperlink  NavigateUri="{Binding DataContext.Url, RelativeSource={RelativeSource Mode=FindAncestor,      
                        AncestorType= ContentControl} }">
                                                    <TextBlock Text="{Binding DataContext.DisplayText, RelativeSource={RelativeSource Mode=FindAncestor,      
                        AncestorType=ContentControl} }"/>
                                                </Hyperlink>
                                            </TextBlock>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding IsLink}" Value="False">
                                <Setter Property="ContentTemplate" >
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding DataContext.DisplayText,RelativeSource={RelativeSource Mode=FindAncestor,      
                        AncestorType=ContentControl} }"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>