我有一个TextBox
,我试图把它绑定到一个DependencyProperty
。这个属性在加载或者我输入TextBox
时从来没有被触及过。我遗漏了什么?
XAML格式
<UserControl:Class="TestBinding.UsernameBox"
// removed xmlns stuff here for clarity>
<Grid>
<TextBox Height="23" Name="usernameTextBox" Text="{Binding Path=Username, ElementName=myWindow, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
</Grid>
</UserControl>
C语言#
public partial class UsernameBox : UserControl
{
public UsernameBox()
{
InitializeComponent();
}
public string Username
{
get
{
// Control never reaches here
return (string)GetValue(UsernameProperty);
}
set
{
// Control never reaches here
SetValue(UsernameProperty, value);
}
}
public static readonly DependencyProperty UsernameProperty
= DependencyProperty.Register("Username", typeof(string), typeof(MainWindow));
}
编辑:我需要实现一个DependencyProperty
,因为我正在创建自己的控件。
2条答案
按热度按时间2vuwiymt1#
您永远无法到达setter,因为它是相依性属性的CLR Package 函数,它宣告为从外部来源设定,例如
mainWindow.Username = "myuserName";
。当属性是透过系结设定,而您想要查看它是否变更时,只要使用PropertyChangedCallback
将PropertyMetadata
加入您的宣告即可,例如:使用此代码,您将在VS的输出窗口中看到属性的更改。
有关回调的更多信息,请阅读Dependency Property Callbacks and Validation
希望这对你有帮助。
gopyfrb32#
你不应该在这里使用
DependencyProperty
!您的TextBox的
Text
属性是DependencyProperty
,而且是系结的 target。您的Username属性是来源,而且不应该是DependencyProperty
!相反,它应该是引发NotifyPropertyChanged的一般旧属性。您所需要的只是:
(旁白:只有在创作自己的控件时才需要使用DependencyProperties。)