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

Value of DependencyProperty reading in code (GetValue() does not work)

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

感谢任何帮助:-)

我希望您的代码(按原样)显示错误。 DP 初始化为 false。在您的控件的构造函数中,尚未应用默认控件样式和 xaml 中设置的属性。

样式仅在调用 OnApplyTemplate() 后应用(除非您强制执行)。

如果要跟踪 DP 更改,则需要 DP 更改处理程序。

When I tried to read the value in the constructor, it only shows the default value which is false.

控件初始化前不能设置属性

Since the callback is a static method, I cannot apply it to the instance of my user control.

您可以在回调中将 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;
    //...
}