当我使用静态文本调用它时(例如BlueText="ABC"),uc会显示正确的文本。但是,当我尝试将其绑定到本地公共属性时,它总是空白。
<src:BlueTextBox BlueText="Feeling blue" /> <!--OK-->
<src:BlueTextBox BlueText="{Binding Path=MyString}" /> <!--UserControl always BLANK!-->
<TextBox Text="{Binding Path=MyString}" Width="100"/> <!--Simple TextBox Binds OK-->
我已将代码简化为以下示例。这是UserControl的XAML代码:
<UserControl x:Class="Binding2.BlueTextBox" ...
<Grid>
<TextBox x:Name="myTextBox" Text="{Binding BlueText}" Foreground="Blue" Width="100" Height="26" />
</Grid>
这是UserControl的后台代码:
public partial class BlueTextBox : UserControl
{
public BlueTextBox()
{
InitializeComponent();
DataContext = this; // shouldn't do this - see solution
}
public static readonly DependencyProperty BlueTextProperty =
DependencyProperty.Register("BlueText", typeof(string), typeof(BlueTextBox));
public string BlueText
{
get { return GetValue(BlueTextProperty).ToString(); }
set { SetValue( BlueTextProperty, value.ToString() ); }
}
这似乎应该很容易,但我做不好。感谢您的帮助!
更多信息:当我尝试Eugene建议的修复方法时,我注意到了一些奇怪的行为。我向元数据添加了一个PropertyChangedCallback;这使我能够观察BlueText的值被设置。当将字符串设置为静态值(="感到忧郁")时,PropertyChanged事件会触发。数据绑定情况下不会触发PropertyChanged。我认为这意味着数据绑定的值没有发送到UserControl。(我认为在静态情况下构造函数不会被调用)
解决方案:Arcturus和jpsstavares正确地识别了问题。首先,在控件的构造函数中设置DataContext=this时,我正在覆盖数据绑定。这阻止了绑定的值被设置。我还必须将控件命名为x:Name=root,并在XAML中指定Binding ElementName=root。为了获得双向绑定,我需要在调用者中设置Mode=TwoWay。以下是正确的代码:
<src:BlueTextBox BlueText="{Binding Path=MyString, Mode=TwoWay}}" /> <!--OK-->
现在是UserControl中的XAML:
<UserControl x:Class="Binding2.BlueTextBox" x:Name="root"...
<Grid>
<TextBox x:Name="myTextBox" Text="{Binding ElementName=root, Path=BlueText}" Foreground="Blue" Width="100" Height="26" />
</Grid>
最后,我在UserControl的构造函数中删除了DataContext=this。
public BlueTextBox()
{
InitializeComponent();
//DataContext = this; -- don't do this
}
谢谢大家的巨大帮助!