HierarchicalDataTemplate 扩展器中的超链接未触发 HandleOnRequestNavigate 事件

Hyperlink in Expander of HierarchicalDataTemplate not firing HandleOnRequestNavigate event

我想我添加了所有必要的部分以将自定义 link 处理添加到我的树视图中,但是当我在调试器中单步执行代码时,我发现我后面的代码从未被调用。

我试图像这样向我的树视图添加一个 hyperlink:

<HierarchicalDataTemplate DataType="{x:Type this:StructuredViewNode}" ItemsSource="{Binding Children}">

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="auto"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>


    <TextBlock Grid.Column="0" Grid.Row="0" Margin="3" TextWrapping="WrapWithOverflow">
        <Hyperlink NavigateUri="{Binding Reference}" RequestNavigate="HandleOnRequestNavigate" >
            <TextBlock Text="{Binding ObjectName}"/>
        </Hyperlink>
    </TextBlock> 

</Grid>

</HierarchicalDataTemplate>

我有所需的代码:

private void HandleOnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
    // Do custom link handling
    e.Handled = true;
}

也许有趣的是,树有一个自定义样式,hyperlink 所在的部分是一个扩展器,定义如下:

<Expander Name="Exp" IsExpanded="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" >
    <Expander.Header>
        <!-- Displays the item's header in the Expander. -->
        <ContentPresenter ContentSource="Header" />
    </Expander.Header>
    <StackPanel>
        <Separator Margin="5" Width="Auto" Background="{StaticResource ItemBorderBrush}" Height="6" ></Separator>
        <!-- Displays the item's children. -->
        <ItemsPresenter />
    </StackPanel>
</Expander>

有人知道为什么我的 hyperlink 处理代码没有被调用吗?

提前致谢!

原来问题是您只能将 strings 作为 URI。所以最简单的解决方案似乎是编写一个转换器并像这样添加对象:

<Hyperlink NavigateUri="{Binding ObjectReference,  
                         Converter={StaticResource ObjectToStringConverter}}" 
           RequestNavigate=""HandleOnRequestNavigate">
    <TextBlock Text="{Binding ObjectReference}"/>
</Hyperlink>

谢谢; 为了总结我们的交换,超链接只接受有效的 url 作为 Uri 对象或字符串,并且只会在这种情况下触发导航事件。如果是 businnes 对象,请将其更改为蓝色前景 Label 控件,更改 Cursor =Cursors.Hand,在您的视图模型中处理单击事件或自定义 MVVM 命令。这样做的伎俩。 :-)