我们一直在努力对这个问题的完整一天,有它全部归纳到一个小例子。 目前,我们正在从Silverlight的转换项目,WPF,Silverlight中的两种版本,在WPF中只有一个呢。
我们有一个字符串类型的DependencyProperty这样一个简单的控制:
public class MyControl : Control
{
public String Text
{
get { return (String)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(String), typeof(MyControl), new PropertyMetadata(null, TextChanged));
private static void TextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}
}
然后我们有一个附加属性类,如下所示:
public class MyAttachedProperty
{
public static readonly DependencyProperty DescriptionProperty = DependencyProperty.RegisterAttached("Description", typeof(String), typeof(MyAttachedProperty), new PropertyMetadata(null, DescriptionPropertyChanged));
public static String GetDescription(DependencyObject obj, String value)
{
return (String)obj.GetValue(DescriptionProperty);
}
public static void SetDescription(DependencyObject obj, String value)
{
obj.SetValue(DescriptionProperty, value);
}
private static void DescriptionPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var MySuperbControl = d as MyControl;
Debug.WriteLine("The control's text is: " + MySuperbControl.Text);
}
public static void DoNothing()
{
}
}
我们实现我们的控制像这样MainWindow.xaml:
<ContentControl x:Name="MyContentControl">
<ContentControl.ContentTemplate>
<DataTemplate>
<local:MyControl x:Name="MyCntrl" Text="DefaultText" att:MyAttachedProperty.Description="Test"/>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
并在代码隐藏有这样的构造函数:
public MainWindow()
{
MyAttachedProperty.DoNothing();
InitializeComponent();
}
如果启动项目这种方式,调试文本将不包含任何文本。 如果调用的InitializeComponent后DoNothing()(),它会显示文字。 任何人都可以请解释一下,为什么? 请注意,在Silverlight两种方式工作。 另外,如果你不使用一个DataTemplate两种方式的工作控制。