Значение чтения DependencyProperty в коде (GetValue () не работает) - PullRequest
0 голосов
/ 18 января 2019

Я создал пользовательский элемент управления и хотел получить значение DependencyProperty «ListBoxReadOnly» в коде. Я устанавливаю значение в XAML:

<control:AutoCompleteTextBox x:Name="actbFullName" ListBoxReadOnly="True"/>

Когда я пытался прочитать значение в конструкторе, он показывает только значение по умолчанию, которое является ложным.

Я пытался получить значение с помощью обратного вызова, но, вероятно, мне не хватает понимания всей структуры. Поскольку обратный вызов является статическим методом, я не могу применить его к экземпляру моего пользовательского элемента управления.

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 голосов
/ 18 января 2019

Когда я пытался прочитать значение в конструкторе, он показывает только значение по умолчанию, которое является ложным.

Свойство нельзя установить до инициализации элемента управления.

Поскольку обратный вызов является статическим методом, я не могу применить его к экземпляру моего пользовательского элемента управления.

Вы можете привести 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;
    //...
}
0 голосов
/ 18 января 2019

Я ожидаю, что ваш код (как есть) будет показывать false. DP инициализируется как false. В конструкторе вашего элемента управления ни стиль элемента управления по умолчанию, ни свойства, установленные в xaml, еще не были применены.

Стиль применяется только после вызова OnApplyTemplate () (если вы его не принудительно).

Если вы хотите отслеживать изменения DP, вам нужен обработчик изменений DP.

...