使用ItemSource时如何为MenuItem添加Tag属性?
嗨,这个需求很容易搞定,咱们只需要通过Menu.ItemContainerStyle给每个自动生成的MenuItem设置Tag属性的绑定就行,我给你两种实用的写法:
简洁版(保留原DisplayMemberPath)
如果你想继续用之前设置的DisplayMemberPath="Name"来显示菜单标题,只需要在ItemContainerStyle里加一个Tag的Setter就好:
<Menu ItemsSource="{Binding YourCategoryList}" DisplayMemberPath="Name"> <Menu.ItemContainerStyle> <Style TargetType="MenuItem"> <!-- 把Tag绑定到当前TblCategory对象的Id属性 --> <Setter Property="Tag" Value="{Binding Id}" /> </Style> </Menu.ItemContainerStyle> </Menu>
完整定制版(替代DisplayMemberPath)
如果之后你想给MenuItem加更多样式定制(比如字体、颜色),可以直接在Style里同时设置Header和Tag的绑定,替代DisplayMemberPath:
<Menu ItemsSource="{Binding YourCategoryList}"> <Menu.ItemContainerStyle> <Style TargetType="MenuItem"> <Setter Property="Header" Value="{Binding Name}" /> <Setter Property="Tag" Value="{Binding Id}" /> <!-- 这里还可以加其他样式设置,比如字体大小 --> <Setter Property="FontSize" Value="14" /> </Style> </Menu.ItemContainerStyle> </Menu>
代码里获取Tag值
设置完成后,在MenuItem的点击事件或者其他逻辑里,你可以这样获取对应的Id:
private void CategoryMenuItem_Click(object sender, RoutedEventArgs e) { if (sender is MenuItem targetItem && targetItem.Tag is int categoryId) { // 这里就可以使用categoryId进行后续操作啦 Console.WriteLine($"选中的分类ID:{categoryId}"); } }
这个思路的核心就是利用ItemContainerStyle来为每个数据项对应的容器(MenuItem)设置属性绑定,因为Menu的ItemsSource绑定的是TblCategory列表,所以Style里的Binding上下文就是单个的TblCategory实例,直接绑定Id属性就可以了。
内容的提问来源于stack exchange,提问作者Marton Peintler Krivan
相关产品推荐
相关产品推荐

