Привязка 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 или более поздней версии.

Другие вопросы по тегам