花了几个小时寻找答案,但还没有运气打破这个难题。
我有一个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。因此,收集项可以获取对要使用的对象的引用。关于如何完成此操作的任何帮助都将有所帮助。谢谢!
答案 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);
}
}
}