Я пытаюсь привязать элемент, вложенный в присоединенное свойство, к моему DataContext
, но проблема в том, что присоединенное свойство не является частью логического дерева и, следовательно, неправильно устанавливает или привязывает к контексту данных родительский объект. Свойство зависимости, в данном случае Value
, всегда равно нулю.
Вот несколько примеров XAML
<StackPanel>
<!-- attached property of static class DataManager -->
<local:DataManager.Identifiers>
<local:TextIdentifier Value="{Binding Path=MyViewModelString}" />
<local:NumericIdentifier Value="{Binding Path=MyViewModelInt}" />
<local:NumericIdentifier Value="{Binding Path=SomeOtherInt}" />
</local:DataIdentifiers>
<!-- normal StackPanel items -->
<Button />
<Button />
</StackPanel>
Из-за реализации это не может быть одно присоединенное свойство - ему нужно быть коллекцией, которая допускает n сущностей. Другим приемлемым решением будет размещение идентификаторов непосредственно в узле, но я не думаю, что этот синтаксис возможен без явного включения этих элементов в логическое дерево. то есть ..
<Button>
<local:NumericIdentifier Value="{Binding}" />
<local:TextIdentifier Value="{Binding}" />
<TextBlock>Actual button content</TextBlock>
</Button>
Вот начало реализации DataManager
.
[ContentProperty("IdentifiersProperty")]
public static class DataManager
{
public static Collection<Identifier> GetIdentifiers(DependencyObject obj)
{
return (Collection<Identifier>)obj.GetValue(IdentifiersProperty);
}
public static void SetIdentifiers(DependencyObject obj, Collection<Identifier> value)
{
obj.SetValue(IdentifiersProperty, value);
}
public static readonly DependencyProperty IdentifiersProperty =
DependencyProperty.RegisterAttached("Identifiers", typeof(Collection<Identifier>), typeof(DataManager), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnIdentifiersChanged)));
}
Я попытался сделать базовый класс Identifiers
реализовать Freezable
в надеется, что это было бы для наследования данных и связывания контекста, но это не имело никакого эффекта (вероятно, потому что он вложен в другой слой - свойство присоединенного).
Еще пара ключевых моментов:
- Я бы хотел, чтобы это работало на любых
UIElement
, а не только StackPanel
s - .
Identifier
s не являются частью визуального дерева. Они не имеют и не должны иметь визуальных элементов - , так как это внутренняя библиотека, я бы предпочел не требовать
Source
или RelativeSource
для привязки, так как это не интуитивно понятно, что это необходимо сделать
Возможно ли связать с унаследованным DataContext
в этом слое разметки? Нужно ли вручную добавлять их в логическое дерево? Если да, то как?
Спасибо!