Значение свойства зависимости по умолчанию - PullRequest
4 голосов
/ 20 апреля 2011

Я новичок в WPF и свойствах зависимостей, и мой вопрос может быть новичком ...

У меня есть следующее свойство зависимости:

    public static readonly DependencyProperty IsEditableProperty = 
        DependencyProperty.Register("IsEditable", typeof(bool), typeof(EditContactUserControl),
        new FrameworkPropertyMetadata(false, OnIsEditablePropertyChanged));

    public bool IsEditable
    {
        get { return (bool)GetValue(IsEditableProperty); }
        set { SetValue(IsEditableProperty, value); }
    }

    private static void OnIsEditablePropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        EditContactUserControl control = source as EditContactUserControl;

        bool isEditable = (bool)e.NewValue;

        if (isEditable)
            control.stackPanelButtons.Visibility = Visibility.Visible;
        else
            control.stackPanelButtons.Visibility = Visibility.Collapsed;
    }

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

Что я делаю не так или как я должен это делать по вашему мнению?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 20 апреля 2011

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

Если вы это сделаете, не имеет значения,свойство инициализировано или нет.

2 голосов
/ 20 апреля 2011

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

Если вы хотите выполнить некоторый код при запуске элемента управления, поместите его в переопределение метода ApplyTemplate (в случае TemplatedControl) или в конец вашего конструктора (в случае UserControl)

Избегайте дублирования этого кода в конструкторе и в обратном вызове измененного свойства: поместите его в общий метод, вызываемый обоими, т. Е.

void OnIsEditableChangedImpl(bool newValue)
{
   ....
}
0 голосов
/ 20 апреля 2011

Я думаю, что гораздо лучше было бы настроить stackPanelButtons.Visibility = Visibility.Collapsed в вашем XAML по умолчанию, в этом случае вам не нужно запускать весь этот код при запуске!

...