将Converter与DependencyProperty结合使用

时间:2011-09-14 22:49:33

标签: silverlight dependencies properties dependency-properties converter

我在派生的AutoCompleteBox控件上创建了一个DependencyProperty - > IsReadOnly

从那里,我试图通过转换器设置值(T / F)。基于转换器值,我想在DependencyProperty的setter中更新嵌套的TextBox样式。在XAML中明确设置属性(IsReadOnly =“True”)可以正常工作,并且setter会触发并更新样式。但是,通过转换器执行此操作不会触发DependencyProperty的setter。我似乎在这里粘贴代码片段时遇到了麻烦(第一次海报)..所以我会尽力给出快速代码:

AutoCompleteBox上的属性:

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

调用Converter,它根据用户的权限返回true或false。但是,这不会调用已注册的DependencyProperty的setter。

..         设置

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

1 个答案:

答案 0 :(得分:3)

这是一个经典的新手骗局。绑定将直接使用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为此属性赋值,就会调用此方法。