在代码中读取DependencyProperty的值(GetValue()不起作用)

时间:2019-01-17 22:53:21

标签: c# wpf user-controls dependency-properties

我创建了一个用户控件,并希望在代码中获取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;
}

感谢您的帮助:-)

2 个答案:

答案 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;
    //...
}