Прикрепленный порядок свойств
В каком порядке применяются прикрепленные свойства к объекту? Я думаю, что я должен игнорировать это, но вот мой сценарий: у меня есть прикрепленное свойство, чтобы прикрепить виртуальную машину к представлению, а затем еще одно присоединенное свойство, которое зависит от первого. Я пытаюсь понять, что произойдет, если второе настроено раньше первого, но я не могу получить ошибку! т.е. первое (модель) всегда устанавливается перед вторым, какой бы порядок в xaml. Кто управляет порядком присвоения? Могу ли я изменить это?
Теперь я имею дело с поздним назначением, подписавшись на событие proeprty change:
DependencyPropertyDescriptor dd = DependencyPropertyDescriptor.FromProperty(FrameworkElement.DataContextProperty,depo.GetType());
dd.AddValueChanged(depo, (s, a) =>
{
ChangeDatacontext(s as DependencyObject);
}
и для имитации проблемы я вручную устанавливаю новый текстовый текст для объекта.
Спасибо Феликс
1 ответ
Я не могу прямо ответить на этот вопрос, потому что я никогда не полагаюсь на то, какое свойство установлено раньше другого, но вы можете управлять вещами с помощью метода, который используют оба прикрепленных свойства.
Вот пример из моего текущего кода:
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
}
по сути, у вас есть два измененных обработчика, и тот из них, который запускается последним, выполняет логику, потому что он видит, является ли другое свойство пустым