【问题标题】:Binding to parent DataContext from ContextMenu从 ContextMenu 绑定到父 DataContext
【发布时间】:2018-08-29 02:29:12
【问题描述】:

我正在努力从 DataTemplate/ContextMenu 控件绑定到父 DataContext。我已经尝试过提到herehere 的解决方案,但没有运气。我无法绑定到属性或命令 - 不会引发异常,但不会调用命令并将属性设置为 null。

这是我的代码示例(尽可能简化):

<Metro:MetroWindow ...>
<Window.DataContext>
    <local:MyViewModel />
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="10*" />
        <ColumnDefinition Width="1*" />
    </Grid.ColumnDefinitions>
    <StackPanel ... />
    <Grid Grid.Column="1">
        <Border ... />
        <ListBox x:Name="FileList" ItemsSource="{Binding AddedFiles}" Margin="5,5,5,5" SelectionMode="Multiple" SelectionChanged="ItemsSelectionChanged">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel MaxWidth="700" IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type local:FileListItem}">
                    <Grid Margin="5" Width="110" ToolTip="{Binding Path=TooltipInfo}" MouseDown="FileItemClick" Tag="{Binding DataContext,RelativeSource={RelativeSource Mode=Self}}">
                        <Grid.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="{Binding PlacementTarget.Tag.test,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}" />
                                <MenuItem Header="Test command" Command="{Binding PlacementTarget.Tag.CloseCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
                            </ContextMenu>
                        </Grid.ContextMenu>
                        <Grid.RowDefinitions ... />
                        <StackPanel ...(Databinding works here!) />
                        <TextBlock ... (Databinding works here!) />
                        <Rectangle ... (Databinding works here!) />
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ListBox>
    </Grid>
</Grid>

我也尝试通过 RelativeSource 将 Tag 属性与 Window 的 DataContext 绑定(以及在其他主题中找到的其他可能的解决方案),但没有任何反应。我的方法肯定有问题。

【问题讨论】:

  • CloseCommand 这个命令在 FileListItem 中吗?
  • @WPFUser 不,它在 ViewModel(父 DataContext)中。这就是想法 - 使用单个 FileListItem 中的 ContextMenu 从父 DataContext 调用命令
  • 那么您应该访问 ListBox 的 DataContext。不是它的项目数据上下文。

标签: c# wpf xaml data-binding


【解决方案1】:

您在 Grid 中找不到 PlacementTarget 属性。像这样改变你的绑定,

 <MenuItem Header="{Binding PlacementTarget.Tag.test,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}" />

或喜欢,

<MenuItem Header="{Binding Parent.PlacementTarget.Tag.test,RelativeSource={RelativeSource Self}}" />

还要访问 ViewModel 的命令,访问 ListBox 的 DataContext 而不是 ListBoxItem,

 <Grid Margin="5" Width="110" ToolTip="{Binding Path=TooltipInfo}" MouseDown="FileItemClick" Tag="{Binding DataContext,RelativeSource={RelativeSource Mode= FindAncestor, AncestorType=ListBox}}">

【讨论】:

  • 访问 ListBoxItem 的 DataContext 而不是 ListBox 是问题的原因 - 我没有注意到,与 Grid 相关的内容提供了单个列表项上下文。非常感谢!
【解决方案2】:

你试过吗? (注意 DataContext 添加)

<MenuItem Header="{Binding DataContext.PlacementTarget.Tag.test,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Grid}}" />

【讨论】:

  • 很遗憾没有改变任何东西,但感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2012-11-05
  • 2011-12-27
  • 2015-06-27
  • 2013-02-02
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多