为什么自定义 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
您需要更改绑定的源以指向 HyperlinkButton 对象,而不是为绑定使用默认的 .DataContext。
<TextBlock Text="{Binding Path=LinkText,
RelativeSource={RelativeSource AncestorType={x:Type local:HyperlinkButton}}}"/>
我在很多地方使用以下 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
您需要更改绑定的源以指向 HyperlinkButton 对象,而不是为绑定使用默认的 .DataContext。
<TextBlock Text="{Binding Path=LinkText,
RelativeSource={RelativeSource AncestorType={x:Type local:HyperlinkButton}}}"/>