Прикрепленный порядок свойств - PullRequest
5 голосов
/ 19 апреля 2011

В каком порядке прикрепленные свойства применяются к объекту?Думаю, я должен игнорировать это, но вот мой сценарий: у меня есть прикрепленное свойство, чтобы прикрепить виртуальную машину к представлению, а затем еще одно присоединенное свойство, которое зависит от первого.Я пытаюсь понять, что произойдет, если второе настроено раньше первого, но я не могу получить ошибку!т.е. первое (модель) всегда устанавливается перед вторым, какой бы порядок в xaml.Кто управляет порядком присвоения?Могу ли я изменить его?

Теперь я имею дело с поздним назначением, подписавшись на событие изменения proeprty:

DependencyPropertyDescriptor dd = DependencyPropertyDescriptor.FromProperty(FrameworkElement.DataContextProperty,depo.GetType());
            dd.AddValueChanged(depo, (s, a) =>
            {
                ChangeDatacontext(s as DependencyObject);
            }

и для имитации проблемы я вручную устанавливаю новый текстовый текст для объекта.,

Спасибо, Феликс

1 Ответ

2 голосов
/ 19 апреля 2011

Я не могу напрямую ответить на этот вопрос, потому что я никогда не полагаюсь на то, какое свойство установлено раньше другого, но вы можете управлять вещами с помощью метода, который используют оба прикрепленных свойства.

вот пример из моего текущего кода:

    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
    }

так что, по сути, у вас есть два измененных обработчика, и тот из них, который запускается последним, выполняет логику, потому что он видит, является ли другое свойство нулевым.

...