C# WPF“;“静态”;列表中的绑定

C# WPF“;“静态”;列表中的绑定,c#,wpf,data-binding,binding,C#,Wpf,Data Binding,Binding,我对列表中的绑定有问题 我有一个物品清单。此列表已绑定到列表框。对于列表中的每个对象,我都可以打开一个上下文菜单: <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="ContextMenu"> <Setter.Value> <ContextMenu> <MenuI

我对列表中的绑定有问题

我有一个物品清单。此列表已绑定到列表框。对于列表中的每个对象,我都可以打开一个上下文菜单:

<ListBox.ItemContainerStyle>
  <Style TargetType="ListBoxItem">
    <Setter Property="ContextMenu">
      <Setter.Value>
        <ContextMenu>
          <MenuItem Header="First"  IsEnabled="{Binding FirstEnabled}"/>
          <MenuItem Header="Second"  IsEnabled="{Binding SecondEnable}"/> 
        </ContextMenu>
      </Setter.Value>
    </Setter>
  </Style>
</ListBox.ItemContainerStyle>

在这样的代码中,列表中的我的对象有两个布尔值要绑定。现在我想把这两个布尔值绑定到对象上。我想把它“静态”绑定到我的DataContext。这不是像这样工作,我不知道如何实现它

我在谷歌上搜索了很多,但没有发现任何有用的东西


谢谢你的帮助

您可以使用ElementName语法引用每个datacontext:

<ListBox x:Name="myListBox">
    <ListBox.ItemContainerStyle>
       <Style TargetType="ListBoxItem">
           <Setter Property="ContextMenu">
               <Setter.Value>
                   <ContextMenu>
                       <MenuItem Header="First"  IsEnabled="{Binding Path=DataContext.FirstEnabled, ElementName=myListBox}"/>
                       <MenuItem Header="Second"  IsEnabled="{Binding Path=DataContext.SecondEnable, ElementName=myListBox}"/> 
                  </ContextMenu>
               </Setter.Value>
           </Setter>
       </Style>
   </ListBox.ItemContainerStyle>
</ListBox>


使用此语法,您可以使用ListBox的DataContext,而不是ListItem。

因为,
ContextMenu
应用于
ListBoxItem
它将有其
DataContext
值,
ListBoxItem
将成为其
PlacementTarget
。因此,如果您想绑定到
ListBox.DataContext
的属性,您需要将当前的
ListBox.DataContext
作为,例如,
Tag
传递到
ListBoxItem
,然后您需要从
ContextMenu
通过其
PlacementTarget
引用它。这一切都是因为
ContextMenu
使用了
Popup
,这是如此简单的
RelativeSource
/
ElementName
绑定无法工作

<Style TargetType="ListBoxItem">
    <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Path=DataContext}"/>
    <Setter Property="ContextMenu">
        <Setter.Value>
            <ContextMenu>
                <MenuItem Header="First"  IsEnabled="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.Tag.FirstEnabled}"/>
                <MenuItem Header="Second" IsEnabled="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.Tag.SecondEnable}"/>                    
            </ContextMenu>
        </Setter.Value>
    </Setter>
</Style>

回答得很好。工作!非常感谢你。