DataGrid中ContextMenu的绑定

6 篇文章 0 订阅
3 篇文章 0 订阅


在WPF中使用DataGrid,有时会用到ContextMenu,当ContextMenu需要绑定DataGrid列的时候,我们按平时的绑定就直接用ElementName的方式了,但在ContextMenu中是不可

以的,可以用以下方式进行绑定:


 <MenuItem ItemsSource="{Binding PlacementTarget.Columns, RelativeSource={RelativeSource AncestorLevel=1, AncestorType={x:Type ContextMenu}, Mode=FindAncestor}}">


在使用MenuItem时,有时会用到模板列,如下:

                        <MenuItem.ItemTemplate>
                            <DataTemplate>
                                <CheckBox x:Name="CurrentCheck" Content="{Binding Header,UpdateSourceTrigger=PropertyChanged}" IsChecked="{Binding Visibility}"/>
                            </DataTemplate>
                        </MenuItem.ItemTemplate>

但当我在后台获取MenuItem的Items的每一个CheckBox时发现获取不到了。。。怎么办呢,最后尝试着用ItemContainerStyle解决了问题,看下边:

Xaml:

  <MenuItem.ItemContainerStyle>
                            <Style TargetType="MenuItem">
                                <Style.Setters>
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate>
                                                <MenuItem>
                                                    <MenuItem.Header>
                                                        <CheckBox x:Name="CurrentCheck" Content="{Binding Header,UpdateSourceTrigger=PropertyChanged}" IsChecked="{Binding Visibility}"/>
                                                    </MenuItem.Header>
                                                </MenuItem>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style.Setters>
                            </Style>
                        </MenuItem.ItemContainerStyle>


CS:

 

  foreach (var item in VisColumn.Items)
            {
                MenuItem itdem = VisColumn.ItemContainerGenerator.ContainerFromItem(item) as MenuItem;
                CheckBox check = itdem.Template.FindName("CurrentCheck", itdem) as CheckBox;
                //......
            }


OK,搞定!





以下是将上述 XAML 代码转换为后台代码的示例: ``` // 创建 ContextMenu 控件 ContextMenu contextMenu = new ContextMenu(); // 创建 MenuItem 控件并添加到 ContextMenu 控件 MenuItem item1 = new MenuItem(); item1.Header = "查看信息"; item1.FontSize = 15; item1.Click += MI_查看_Click; TextBlock icon1 = new TextBlock(); icon1.Text = "\uf007"; icon1.Foreground = (Brush)FindResource("PrimaryBrush"); icon1.FontFamily = new FontFamily(new Uri("pack://application:,,,/LSR/Resources/ttf/"), "./#Font Awesome 5 Pro Light"); item1.Icon = icon1; contextMenu.Items.Add(item1); MenuItem item2 = new MenuItem(); item2.Header = "查看图片"; item2.FontSize = 15; item2.Click += MI_查看图片_Click; TextBlock icon2 = new TextBlock(); icon2.Text = "\uf007"; icon2.Foreground = (Brush)FindResource("PrimaryBrush"); icon2.FontFamily = new FontFamily(new Uri("pack://application:,,,/LSR/Resources/ttf/"), "./#Font Awesome 5 Pro Light"); item2.Icon = icon2; contextMenu.Items.Add(item2); // 将 ContextMenu 控件绑定DataGrid 控件的 ContextMenu 属性上 dataGrid.ContextMenu = contextMenu; // 设置 DataGrid 控件的数据源 dataGrid.ItemsSource = DataList; ``` 其,`dataGrid` 是 DataGrid 控件的实例名,`DataList` 是数据源。需要在代码创建 MenuItem 和 TextBlock 控件,并设置它们的属性和事件处理程序。最后将 ContextMenu 控件绑定DataGrid 控件的 ContextMenu 属性上,即可实现动态生成右键菜单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值