无法正确初始化XAML

时间:2019-06-15 15:46:54

标签: c# wpf

花了几个小时寻找答案,但还没有运气打破这个难题。

我有一个ObservableCollection附加属性,我需要获取该附加属性的宿主UIElement才能正确初始化此集合。

public static readonly DependencyProperty ContentProperty = DependencyProperty.RegisterAttached(
        "Content", typeof(AnimaCollection), typeof(UserControl), new FrameworkPropertyMetadata(new AnimaCollection(), BehaviorPropertyChangedCallback));
<Button Width="80" Height="30">
    <core:AnimaBehavior.Content>
        <core:AttachedAnima ToValue=".3" />
        <core:AttachedAnima ToValue="1"/>
    </animaCore:AnimaBehavior.Content>
</Button>

我指定了BehaviorPropertyChangedCallback,但是在XAML中设置collection时,它没有触发。我无法将属性默认值设置为null,因为在尝试将新项添加到null时它将在运行时失败。同样,如果我在XAMl中使用基础AnimaCollection项目指定AttachedAnima,并将默认属性值设置为null,则回调不会再次触发。

我需要以某种方式获取要附加的父UIElement。因此,收集项可以获取对要使用的对象的引用。关于如何完成此操作的任何帮助都将有所帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

仅当属性更改时才调用回调。将新集合分配给属性时,将调用回调。将项目添加到集合时,只会触发集合的CollectionChanged事件(因为它是ObservableCollection)。这意味着BehaviorPropertyChangedCallback在您的情况下不会被调用。您应该添加第二个附加属性,例如称为IsEnabled并向其中添加回调。 InitializeOnAttached()。在AnimaBehavior.IsEnabled = "True"回调之类的元素上设置该元素后,便会调用该回调,并且可以通过投射InitializeOnAttached()参数来访问附加元素。

DependencyObject

在XAML中:

public class AnimaBehavior
{
  public static readonly DependencyProperty ContentProperty = DependencyProperty.RegisterAttached(
        "Content", typeof(AnimaCollection), typeof(UserControl), new FrameworkPropertyMetadata(new AnimaCollection(), BehaviorPropertyChangedCallback));

  public static readonly DependencyProperty ContentProperty = DependencyProperty.RegisterAttached(
        "IsEnabled", typeof(bool), typeof(UserControl), new FrameworkPropertyMetadata(false, InitializeOnAttached));

  public static void SetContent(UIElement element, AnimaCollection value)
  {
    element.SetValue(ContentProperty, value);
  }

  public static AnimaCollection GetContent(UIElement element)
  {
    return (AnimaCollection) element.GetValue(ContentProperty);
  }

  private void InitializeOnAttached(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
    if (d is Button attachingElement)
    {
       // Use or store Button
    }


    // Or access AnimaCollection or subscribe to CollectionChanged of AnimaCollection 
    if (d is UIElement attachingElement)
    {
       // Or access AnimaCollection or subscribe to CollectionChanged of AnimaCollection 
       AnimaCollection contentCollection = AnimaBehavior.GetContent(attachingElement);
    }
  }
}