Я немного поработал в 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')