我创建了一个用户控件,并希望在代码中获取DependencyProperty“ ListBoxReadOnly”的值。我在XAML中设置了值:
<control:AutoCompleteTextBox x:Name="actbFullName" ListBoxReadOnly="True"/>
当我尝试在构造函数中读取值时,它仅显示默认值false。
我试图通过回调获取值,但是可能我对整个框架缺乏了解。由于回调是静态方法,因此无法将其应用于用户控件的实例。
public static readonly DependencyProperty ListBoxReadOnlyDependency =
DependencyProperty.Register("ListBoxReadOnly", typeof(bool),
typeof(AutoCompleteTextBox), FrameworkPropertyMetadata
(false, FrameworkPropertyMetadataOptions.AffectsRender));
public bool ListBoxReadOnly
{
get
{
return (bool) GetValue(ListBoxReadOnlyDependency);
}
set
{
SetValue(ListBoxReadOnlyDependency, value);
}
}
// constructor of user control
public AutoCompleteTextBox()
{
InitializeComponent();
// *** shows "false" (default value) even though set to true in XAML
// *** see XAML above ***
var test = ListBoxReadOnly;
}
感谢您的帮助:-)
答案 0 :(得分:1)
我希望您的代码(按原样)显示为false。 DP初始化为false。在控件的构造函数中,尚未应用默认控件样式或xaml中设置的属性。
该样式仅在调用OnApplyTemplate()后才应用(除非您强制执行)。
如果要跟踪DP更改,则需要一个DP更改处理程序。
答案 1 :(得分:0)
当我尝试在构造函数中读取值时,它仅显示默认值false。
无法在控件初始化之前设置属性。
由于回调是静态方法,因此无法将其应用于用户控件的实例。
您可以将DependencyObject
强制转换为回调中控件的类型:
public static readonly DependencyProperty ListBoxReadOnlyDependency =
DependencyProperty.Register("ListBoxReadOnly", typeof(bool),
typeof(AutoCompleteTextBox), new FrameworkPropertyMetadata
(false, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnChanged)));
private static void OnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
AutoCompleteTextBox ctrl = (AutoCompleteTextBox)d;
var x = ctrl.ListBoxReadOnly;
//...
}