2013-09-13 5 views
0

Я вложенное свойство этого наследуемые:Связывание на унаследованном свойстве зависимостей

public static readonly DependencyProperty ResourcePackageProperty = 
      DependencyProperty.RegisterAttached("ResourcePackage", typeof(IResourcePackage), typeof(ResourceUIElement), 
               new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits)); 

На контроле контейнера, я установил это вложенное свойство управление => потомка наследует это и это хорошо до сих пор.

Теперь я пытаюсь определить привязку, как это:

var binding = new Binding(); 
binding.Source = proxy; 
binding.Mode = BindingMode.OneWayToSource; 
binding.Path = new PropertyPath("Value"); 
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
BindingOperations.SetBinding(childControl, ResourceUIElement.ResourcePackageProperty, binding); 

Это, как предполагается обновить значение -property из прокси -объект когда ResourcePackage-свойство изменений в childControl ,

Это работает, когда я напрямую установить вложенное свойство на дочерний элемент управления, но не работу, когда вложенное свойство изменяется на элементе управления контейнера (и, таким образом, наследуется в childControl).

Возможно ли это вообще с системой свойств зависимостей WPF?

+0

Обратите внимание, что вы не устанавливаете привязки для полных классов, а для экземпляров. Поэтому, если вы хотите, чтобы ваше прокси-значение изменилось, если AP в вашем элементе управления контейнером изменилось, вам нужно установить другое связывание с вашим контейнером в качестве цели. –

+0

Я понял это так: childControl-instance получает AP из containercontrol-instance => таким образом, я предположил, что изменение AP на containercontrol также изменяет его на дочерних элементах управления (поскольку они их выводят), а привязки будут запускаться. Если это не так, я ничего не могу сделать против этого - код, который создает привязку, не знает, какой у предка-управления есть набор AP. –

+0

С помощью всего лишь «копирования» методов классов, реквизитов и т. Д., Но экземпляры, которые вы создаете из этих классов, не связаны. Поэтому изменение свойства в экземпляре базового класса не влияет на экземпляры производных классов. Но позвольте мне сказать вам: всегда есть способ, не сдавайтесь;) Вы могли бы, например, добавить свойство, называемое ContainerControl, вашему childControl, которое устанавливается, когда дочерний элемент управления добавляется в элемент управления контейнера. –

ответ

0

Теперь я нашел решение:

var binding = new Binding(); 
binding.Source = childControl; 
binding.Mode = BindingMode.OneWay; 
binding.Path = new PropertyPath("(0)", ResourceUIElement.ResourcePackageProperty); 
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
BindingOperations.SetBinding(proxy, Proxy.ValueProperty, binding); 

токарной связывание в противоположном направлении работ. Раньше это был OneWayToSource, теперь Proxy-класс получен из DependencyObject, а привязка - OneWay.

Смежные вопросы