的DependencyProperty的值为null时附加属性的类方法被调用(DependencyP

2019-10-20 07:50发布

我们一直在努力对这个问题的完整一天,有它全部归纳到一个小例子。 目前,我们正在从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两种方式的工作控制。

Answer 1:

这是有趣的副作用。 这是有道理的,当你认为的DependencyProperty注册它增加了一些全球征集。 如果你调用静态构造函数在MyAttachedProperty第一它被添加到收藏第一和第一设置的对象。

如果强制静态构造函数中添加相同的空静态方法DoNothing对MyControl先运行,​​那么你可以做

    public MainWindow()
    {
        MyControl.DoNothing();
        MyAttachedProperty.DoNothing();
        InitializeComponent();
    }

和文本将被显示或在壳体

    public MainWindow()
    {
        MyAttachedProperty.DoNothing();
        MyControl.DoNothing();
        InitializeComponent();
    }

空文本将被显示。



文章来源: DependencyProperty's value is null when method in attached property's class is called