Привязка ElementName из контекстного меню не может найти цель
Я пытаюсь привязать элемент к контекстному меню внутри кнопки выпадающего меню ( http://shemesh.wordpress.com/2011/10/27/wpf-menubutton/). Хотя за пределами контекстного меню привязка, кажется, работает, привязка внутри контекстного меню - нет.
Это XAML (очень упрощенный):
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" CanContentScroll="False">
<ListBox x:Name="lbScenarios" HorizontalContentAlignment="Stretch">
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<ItemsPresenter Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=ActualWidth}"/>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border>
<Expander>
<Expander.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Margin="5,0,0,0" Grid.Column="0" VerticalAlignment="Center">Results</TextBlock>
<local:MenuButton Grid.Column="3" Content="Menu" Margin="5,0,0,0" VerticalAlignment="Center">
<local:MenuButton.Menu>
<ContextMenu>
<MenuItem Header="Save pie chart as image"
Command="{Binding SaveChartImageCommand}"
CommandParameter="{Binding ElementName=pieChart}" />
<MenuItem Header="Save bar chart as image"
Command="{Binding SaveChartImageCommand}"
CommandParameter="{Binding ElementName=barChart}" />
</ContextMenu>
</local:MenuButton.Menu>
</local:MenuButton>
</Grid>
</Expander.Header>
<Expander.Content>
<StackPanel>
<Image x:Name="pieChart" />
<Image x:Name="barChart" />
</StackPanel>
</Expander.Content>
</Expander>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
</ScrollViewer>
</Grid>
</Window>
Привязка, которая не работает, является {Binding ElementName=pieChart}, что забавно, потому что команда находится. Кажется, я не могу заставить RelativeSource работать, но может ли кто-нибудь помочь мне с правильным связыванием?
1 ответ
Поскольку ContextMenu не лежит в том же дереве визуалов, что и его цель размещения, привязка ElementName не будет работать, поскольку для этого требуется, чтобы оба элемента управления были в одном дереве визуалов.
Попробуйте использовать x:Reference
который не имеет этого ограничения быть в том же визуальном дереве.
CommandParameter="{Binding Source={x:Reference pieChart}}"
ИЛИ ЖЕ
используйте это так
CommandParameter="{x:Reference pieChart}"
Примечание - x: ссылка будет найдена в WPF 4.0 или более поздней версии.