WPF “static” binding in a List

无人久伴 提交于 2020-01-06 02:29:05

问题


I have a problem with a binding in a List.

I have a List of objects. This List is bound to a ListBox. Of every object in my List I can open a ContextMenu:

<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>

In the code like this my objects in the list having the two booleans to bind. Now I want to bind this two booleans not to the objects. I want to bind it "static" to my DataContext. This is not working like this and I have no idea how to realize it.

I googled a lot but found nothing helpful ...

Thanks for helping!


回答1:


Since, ContextMenu applies to ListBoxItem it will have its DataContext value and ListBoxItem will be its PlacementTarget. So if you want to bind to property of ListBox.DataContext you need to pass current ListBox.DataContext as, for example, Tag to ListBoxItem and then you need to refer to it from ContextMenu via its PlacementTarget. It's all because ContextMenu uses Popup which creates its own visual tree so simple RelativeSource/ElementName binding won't work

<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>



回答2:


You can reference every datacontext with the ElementName Syntax:

<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>

With this syntax you use the DataContext of your ListBox and not from the ListItem.



来源:https://stackoverflow.com/questions/32537261/wpf-static-binding-in-a-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!