【发布时间】:2011-04-18 13:45:41
【问题描述】:
我一直在 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>
在此示例中,我尝试将子元素的属性绑定到父元素的属性。由于此项目不在元素下的 可视化树 中,而只是一个属性,因此我无法使用 FindAncestor 定位父项。以我的经验,在这种情况下我也没有运气绑定ElementName(尝试了Name="" 和x:Name="")。
这里的范围是什么? MenuItem 与 ComboBox 有什么关系?因为我知道它在这里继承了它的父级的 DataContext,为什么 FindAncestor / ElementName 无法访问它?
示例 #2 - 资源 + 静态资源/动态资源
<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="Whatever" 或 x:Name="Whatever"
更新(根据要求)
我遇到的绑定失败类型是:
System.Windows.Data 错误:4:找不到与引用“RelativeSource FindAncestor、AncestorType='System.Windows.Controls.ComboBox'、AncestorLevel='1''的绑定源。绑定表达式:路径=选定项;数据项=空;目标元素是'MenuItem'(名称='');目标属性是'Header'(类型'object')
【问题讨论】:
-
您能否添加一些有关您在输出窗口中看到的绑定失败的详细信息
-
@benPearce:更新了更多信息。
标签: c# wpf xaml data-binding scope