Использование конвертера совместно с DependencyProperty - PullRequest
3 голосов
/ 15 сентября 2011

Я создал DependencyProperty на своем производном элементе управления AutoCompleteBox -> IsReadOnly

Оттуда я пытаюсь установить значение (T / F) через конвертер.Исходя из значения конвертера, я хотел бы обновить вложенный стиль TextBox в установщике свойства DependencyProperty.Явная установка свойства в XAML (IsReadOnly = "True") работает нормально, а установщик запускает и обновляет стиль.Тем не менее, выполнение этого через конвертер НЕ запускает установщик свойства DependencyProperty.Кажется, у меня возникают проблемы при вставке фрагментов кода здесь (первый постер) .. поэтому я сделаю все возможное, чтобы быстро выполнить код:

Свойство на AutoCompleteBox:

IsReadOnly ="{Binding Converter = {StaticResource IsReadOnlyVerifier}, ConverterParameter = 'Edit Client'}"

, который вызывает преобразователь, который возвращает значение true или false, основываясь на разрешениях пользователя.Это, однако, не вызывает установщик зарегистрированного DependencyProperty.

.. set

        {
            if (value)
            {
                var style = StyleController.FindResource("ReadOnlyTextBox") as Style;
                TextBoxStyle = style;
            }
            else
            {
                TextBoxStyle = null;
            }
            SetValue(IsReadOnlyProperty, value);
        }

1 Ответ

3 голосов
/ 15 сентября 2011

Это классическая новичок готча.Привязки будут устанавливать цель DependencyProperty, используя SetValue напрямую, они не присваивают значение через метод установки свойства POCO.

Ваше свойство IsReadOnly должно выглядеть следующим образом: -

  #region public bool IsReadOnly
  public bool IsReadOnly
  {
       get { return (bool)GetValue(IsReadOnlyProperty); }
       set { SetValue(IsReadOnlyProperty, value); }
  }

  public static readonly DependencyProperty IsReadOnlyProperty =
     DependencyProperty.Register(
         "IsReadOnly",
         typeof(bool),
         typeof(MyAutoCompleteBox),
         new PropertyMetaData(false, OnIsReadOnlyPropertyChanged) );

  private static void OnIsReadOnlyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
       MyAutoCompleteBox source = d as MyAutoCompleteBox;
       source.OnIsReadOnlyChanged((bool)e.OldValue, (bool)e.NewValue);    
  }

  private void OnIsReadOnlyChanged(bool oldValue, bool newValue)
  {
       TextBoxStyle = newValue ? StyleControlller.FindResource("ReadOnlyTextBox") as Style ? null;
  }
  #endregion

Это влияет на любые другие изменения, когда свойство зависимости установлено, вы должны предоставить делегату PropertyChangedCallback PropertyMetaData при регистрации DependencyProperty.Он будет вызываться всякий раз, когда SetValue используется для присвоения значения этому свойству.

...