我在派生的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/