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>