【问题标题】:Why isn't the binding in a custom WPF user control for hyperlinks working?为什么超链接的自定义 WPF 用户控件中的绑定不起作用?
【发布时间】:2015-04-22 01:25:00
【问题描述】:

我有很多地方使用以下 XAML 代码创建超链接(这样做是为了让我通过 Caliburn Micro 进行的基于约定的绑定与控件同名的事件挂钩):

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

当然,我在每个链接中自定义名称和链接文本。我决定创建一个用户控件来简化这一点。 HyperlinkBut​​ton.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"/>

屏幕上实际上没有出现任何内容(嗯,除了我期望链接的空白处)。

我在哪里做错了?

【问题讨论】:

    标签: c# wpf xaml wpf-controls


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常好——我不可能想出那个。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多