我现在已经如何解决我的问题,但我需要解释为什么它会这样工作。我创建了一个设置控件Text
属性的测试附加属性。TextBlock
由于我需要在附加属性中包含更多参数,因此我使该属性接受通用属性 ( IGeneralAttProp
),因此我可以像这样使用它:
<TextBlock>
<local:AttProp.Setter>
<local:AttPropertyImpl TTD="{Binding TextToDisplay}" />
</local:AttProp.Setter>
</TextBlock>
以下是Setter
附加属性和IGeneralAttProp
接口的实现:
public class AttProp {
#region Setter dependancy property
// Using a DependencyProperty as the backing store for Setter.
public static readonly DependencyProperty SetterProperty =
DependencyProperty.RegisterAttached("Setter",
typeof(IGeneralAttProp),
typeof(AttProp),
new PropertyMetadata((s, e) => {
IGeneralAttProp gap = e.NewValue as IGeneralAttProp;
if (gap != null) {
gap.Initialize(s);
}
}));
public static IGeneralAttProp GetSetter(DependencyObject element) {
return (IGeneralAttProp)element.GetValue(SetterProperty);
}
public static void SetSetter(DependencyObject element, IGeneralAttProp value) {
element.SetValue(SetterProperty, value);
}
#endregion
}
public interface IGeneralAttProp {
void Initialize(DependencyObject host);
}
和AttPropertyImpl
类的实现:
class AttPropertyImpl: Freezable, IGeneralAttProp {
#region IGeneralAttProp Members
TextBlock _host;
public void Initialize(DependencyObject host) {
_host = host as TextBlock;
if (_host != null) {
_host.SetBinding(TextBlock.TextProperty, new Binding("TTD") { Source = this, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
}
}
#endregion
protected override Freezable CreateInstanceCore() {
return new AttPropertyImpl();
}
#region TTD dependancy property
// Using a DependencyProperty as the backing store for TTD.
public static readonly DependencyProperty TTDProperty =
DependencyProperty.Register("TTD", typeof(string), typeof(AttPropertyImpl));
public string TTD {
get { return (string)GetValue(TTDProperty); }
set { SetValue(TTDProperty, value); }
}
#endregion
}
AttPropertyImpl
如果继承自 ,一切正常Freezable
。如果它只是一个DependencyObject
比它无法与消息绑定:
找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。绑定表达式:路径=TextToDisplay;数据项=空;目标元素是“AttPropertyImpl”(HashCode=15874253);目标属性是“TTD”(类型“字符串”)
当它是 a 时FrameworkElement
,绑定没有错误,但是该值未绑定。
问题是:为什么AttPropertyImpl
必须继承 fromFreezable
才能正常工作。