Есть ли более чистый способ привязать свойство к DataContext владельца? - PullRequest
3 голосов
/ 27 апреля 2010

У меня есть код, который выглядит следующим образом:

<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, если он не указан явно.

1 Ответ

1 голос
/ 27 апреля 2010

Немного чище (короче) способ использовать ElementName в вашем Binding так:

<Expander Header="{Binding SelectedSlot.Name}"
          x:Name="expander"
          Visibility="{Binding ShowGroupSlot, Converter={StaticResource BooleanToVisibility}}">
    <Controls:GroupPrototypeSlotControl Slot="{Binding DataContext.SelectedSlot, ElementName=expander}" />
</Expander>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...