Области привязки данных - требуется пояснение

Я немного поработал в WPF, и мои привязки по большей части работают, но здесь мне нужно уточнить область действия. Я' мы столкнулись с некоторыми, казалось бы, простыми операциями, которые требуют глупых обходных путей привязки, и я считаю, что во многом это связано с областью видимости.

Пример №1 - Вне визуального дерева, привязка к родительскому объекту.

<ComboBox x:Name="Combo1" ItemsSource="{Binding SomeListOfStrings}">
  <ComboBox.ContextMenu>
    <ContextMenu>
      <MenuItem Header="{Binding ElementName=Combo1, Path=SelectedItem}" />
      <MenuItem Header="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=SelectedItem}" />
    </ContextMenu>
  </ComboBox.ContextMenu>
</ComboBox>

В этом примере я ' m пытается привязать свойство дочернего элемента к родительскому свойству. Поскольку этот элемент не находится в визуальном дереве под элементом, а является просто свойством, я не могу найти родителя с помощью FindAncestor . По моему опыту, мне не повезло связать с ElementName и в этом случае (Пробовал оба Name = "" и x: Name = "" ).

Какой здесь размах? Как MenuItem соотносится с ComboBox? Поскольку я знаю, что он наследует DataContext своего родителя здесь, почему он недоступен с помощью FindAncestor / ElementName?

Пример №2 - Ресурсы + StaticResource / DynamicResource

<UserControl x:Name="MainControl" ... />
  <UserControl.Resources>
     <Style TargetType="ComboBox">
       <Setter Property="ContextMenu">
         <Setter.Value>
           <ContextMenu ItemsSource="{Binding ViewModelsMenuItems}" />
         </Setter.Value>
       </Setter>
     </Style>
     <Style TargetType="ComboBox" x:Key="Example2_Style2">
       <Setter Property="ContextMenu">
         <Setter.Value>
           <ContextMenu ItemsSource="{Binding ElementName=MainControl, Path=DataContext.ViewModelMenuItems}" />
         </Setter.Value>
       </Setter>
     </Style>
  </UserControl.Resources>
  <StackPanel>
    <ComboBox />
    <ComboBox />
    <ComboBox Style="{StaticResource Example2_Style2" />
  </StackPanel>
</UserControl>

В этом примере я пытаюсь установить контекстное меню для всех ComboBox в моем пользовательский элемент управления (или определенные, если я использовал именованный стиль). Поскольку ContextMenu определен вне области видимости и "установлен" в области видимости, у меня раньше были проблемы с наследуемым DataContext или возможностью использовать ElementName (поскольку элемент находится вне области видимости?).

Дополнительный вопрос

Так как мне совсем не повезло с ElementName , может кто-нибудь подскажет мне, что использовать, потому что я вижу и то, и другое ПО ВСЕМУ Интернету / книгам. Name = "Без разницы" или x: Name = "Что угодно"

Обновление (согласно запросу)

Типы сбоев привязки, которые я получаю:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ComboBox', AncestorLevel='1''. BindingExpression:Path=SelectedItem; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'Header' (type 'object')
1
задан H.B. 14 June 2011 в 02:34
поделиться