У меня есть код, который выглядит следующим образом:
<Expander Header="{Binding SelectedSlot.Name}"
Visibility="{Binding ShowGroupSlot, Converter={StaticResource BooleanToVisibility}}">
<Controls:GroupPrototypeSlotControl Slot="{Binding DataContext.SelectedSlot,
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}}" />
</Expander>
Это работает, но уродство привязки слотов беспокоит меня. Это необходимо, потому что GroupPrototypeSlotControl имеет GroupPrototypeViewModel в качестве своего DataContext. Если я просто использую {Binding SelectedSlot}
, он пытается разрешить его в «дочерней» модели представления, что не удается. Я обхожу это, явно просматривая DataContext моего родительского элемента управления. Есть ли более чистый способ сделать этот тип переплета?
РЕДАКТИРОВАТЬ: Я нашел более чистый способ решения моей проблемы, хотя это все еще похоже на взломать. Я изменил GroupPrototypeSlotControl так, чтобы он имел LayoutRoot верхнего уровня (в данном случае StackPanel), а затем установил DataContext для LayoutRoot в ViewModel, а не установил DataContext всего элемента управления. Это позволяет мне использовать синтаксис {Binding SelectedSlot}
, где я использую элемент управления (так как элемент управления все еще имеет родительский DataContext), за счет небольшого увеличения сложности элемента управления. В общем, это, вероятно, лучший шаблон для пользовательского элемента управления, поскольку потребитель элемента управления ожидает, что {Binding} разрешит их родительский DataContext, если он не указан явно.