为什么自定义 WPF 用户控件中的超链接绑定不起作用?

Why isn't the binding in a custom WPF user control for hyperlinks working?

我在很多地方使用以下 XAML 代码来创建一个 hyperlink(这样做是为了让我通过 Caliburn Micro 基于约定的绑定连接一个事件与控件同名):

<Button Style="{StaticResource HyperlinkButton}" x:Name="AddFile">
    <TextBlock>
       <Hyperlink>Add file</Hyperlink>
    </TextBlock>
</Button>

当然,在每个 link 中我自定义名称和 link 文本。我决定创建一个用户控件来简化它。 HyperlinkButton.xaml 文件中的 XAML 如下所示:

<UserControl x:Class="SampleApp.UserControls.HyperlinkButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             >
    <Button Style="{StaticResource HyperlinkButton}">
        <TextBlock>
            <Hyperlink>
                <TextBlock Text="{Binding Path=LinkText}"/>                
            </Hyperlink>
        </TextBlock>
    </Button>
</UserControl>

在我的代码隐藏中,我为 LinkText 创建了一个 DependencyProperty:

public static readonly DependencyProperty LinkTextProperty = DependencyProperty.Register("LinkText", 
                                                                                         typeof(string), 
                                                                                         typeof(HyperlinkButton),
                                                                                         new UIPropertyMetadata("Fill in LinkText", new PropertyChangedCallback(OnLinkTextChanged), new CoerceValueCallback(OnCoerceLinkText)));

public string LinkText
{
    get { return (string)GetValue(LinkTextProperty); }
    set { SetValue(LinkTextProperty, value); }
}

最后,我尝试在另一个文件中使用该控件:

<uc:HyperlinkButton LinkText="Add File" x:Name="AddFile"/>

屏幕上实际上没有显示任何内容(好吧,除了我预期 link 的空白处)。

我哪里出错了?

您在 UserControl 中的绑定绑定到 HyperlinkButton.DataContext.LinkText,而不是 Hyperlink.LinkText

您需要更改绑定的源以指向 HyperlinkBut​​ton 对象,而不是为绑定使用默认的 .DataContext。

<TextBlock Text="{Binding Path=LinkText,
    RelativeSource={RelativeSource AncestorType={x:Type local:HyperlinkButton}}}"/>