附加属性的顺序

6
附加属性应用于对象的顺序是什么?我想我应该忽略这个问题,但是在我的情况下:我有一个附加属性将VM粘贴到View上,然后另一个附加属性依赖于第一个属性。我正在尝试查看如果第二个属性在第一个属性之前设置会发生什么,但我无法获得错误!也就是说,第一个(模型)始终在XAML中的任何顺序下都先设置,谁控制分配的顺序?我能改变它吗?
现在我通过订阅属性更改事件来处理迟到的分配。
DependencyPropertyDescriptor dd = DependencyPropertyDescriptor.FromProperty(FrameworkElement.DataContextProperty,depo.GetType());
            dd.AddValueChanged(depo, (s, a) =>
            {
                ChangeDatacontext(s as DependencyObject);
            }

为了模拟问题,我手动设置了一个新的数据上下文对象。

谢谢, Felix

1个回答

3

我无法直接回答这个问题,因为我从未依赖于哪个属性先设置,但是您可以使用一个方法来管理两个附加属性。

以下是我目前代码中的示例:

    public static readonly DependencyProperty RuleVMProperty =
        DependencyProperty.RegisterAttached("RuleVM", typeof(DocumentRuleViewModel), typeof(DocumentRuleViewModel), new UIPropertyMetadata(null, RuleVMChanged));

    public static void RuleVMChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
        var el = GetRefid(sender);
        var vm = args.NewValue as DocumentRuleViewModel;
        if(vm==null)
            return;
        vm.SetDocumentFromRefid(sender, el);
    }

    public static readonly DependencyProperty RefidProperty =
        DependencyProperty.RegisterAttached("Refid", typeof(XmlElement), typeof(DocumentRuleViewModel), new UIPropertyMetadata(RefidChanged));

    public static void RefidChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
        var el = args.NewValue as XmlElement;
        var vm = GetRuleVM(sender);
        if (vm == null)
            return;
        vm.SetDocumentFromRefid(sender, el);
    }

    private void SetDocumentFromRefid(DependencyObject sender, XmlElement element)
    {
        ... // this is where the actual logic sits
    }

基本上,您有两个更改处理程序,无论哪一个最后触发都会执行逻辑,因为它会查看另一个属性是否为空。


1
这个可以工作,谢谢。但是如果你有两个不同的对象怎么办?现在我正在订阅对象上的PropertyChange事件,并且它对我起作用了,但我只是好奇为什么一个属性总是在另一个属性之前设置。 - Felice Pollano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接