我在派生的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);
}
答案 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
为此属性赋值,就会调用此方法。