【问题标题】:Value of DependencyProperty reading in code (GetValue() does not work)在代码中读取 DependencyProperty 的值(GetValue() 不起作用)
【发布时间】:2019-01-17 22:53:20
【问题描述】:

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

任何帮助表示赞赏:-)

【问题讨论】:

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


    【解决方案1】:

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

    样式仅在调用 OnApplyTemplate() 后应用(除非你强制它)。

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

    【讨论】:

    • 非常感谢@SlegeHammer。有了这些知识,我找到了不同的解决方案。
    【解决方案2】:

    当我试图读取构造函数中的值时,它只显示默认值为 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;
        //...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 2011-12-25
      • 1970-01-01
      相关资源
      最近更新 更多