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

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

AutoCompleteBox上的属性:

IsReadOnly =“{绑定(bind)转换器= {StaticResource IsReadOnlyVerifier},ConverterParameter ='编辑客户端'}”

后者调出Converter,根据用户的权限返回true或false。但是,这不会调用已注册DependencyProperty的设置方法。

..

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

最佳答案

这是经典的新手陷阱。绑定(bind)将直接使用DependencyProperty设置目标SetValue,它们不会通过POCO属性 setter 方法分配值。

您的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委托(delegate)。每当使用SetValue为该属性分配值时,将调用此方法。

关于silverlight - 将Converter与DependencyProperty结合使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7423920/

10-11 19:25