我们有一个 TickerUserControl,它有一个简单的 Text 属性,它代表股票代码的显示文本。
我们真的必须在 UserControl 中使用这些 DependencyProperty 模式的东西(见下文)还是有更简单的方法来实现这一点?
当我们想使用我们的 UserControl 并将文本字段绑定到 ViewModel 的属性时,我们必须使用以下奇怪的绑定语法。为什么我们不能像所有其他控件一样只使用 'Text="{Binding Text}"' ?UserControl 的属性实现有什么问题吗?
用户控件的使用
<userControls:TickerUserControl Text="{Binding Path=Parent.DataContext.TickerText, RelativeSource={RelativeSource Self}, Mode=OneWay}"/>
UserControl 的属性实现(代码隐藏)
public partial class TickerUserControl : UserControl
{
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(TickerUserControl), new PropertyMetadata(""));
// ...
}
UserControl 的 XAML 片段
<UserControl x:Class="Project.UserControls.TickerUserControl"
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"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
mc:Ignorable="d">
<TextBlock Text="{Binding Text}">
<!-- ... -->
解决方案
问题是 UserControl 内的 DataContext 的设置。我删除了 DataContext 绑定,为 UserControl 添加了一个名称,并修改了 UserControl 内的 TextBox 绑定。之后,我能够从外部“照常”绑定。
<userControls:TickerUserControl Text="{Binding TickerText}"/>
<UserControl x:Class="Project.UserControls.TickerUserControl"
Name="TickerUserControl"
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">
<TextBlock Text="{Binding Text, ElementName=TickerUserControl}">
<!-- ... -->