WPF数据网格-如何在没有绑定的情况下设置模板列中的复选框
本文关键字:设置 情况下 复选框 绑定 网格 数据网 数据 WPF | 更新日期: 2023-09-27 17:58:03
我有一个数据网格,它由从Web服务检索的数据以编程方式填充。数据网格的最后一列包含复选框,用于显示映射上的每一行值。该列是用如下模板列创建的:
DataGridTemplateColumn column = new DataGridTemplateColumn();
column.Header = "Show on map";
DataTemplate dt = new DataTemplate();
FrameworkElementFactory checkBoxFactory = new FrameworkElementFactory(typeof(CheckBox));
checkBoxFactory.AddHandler(CheckBox.ClickEvent, new RoutedEventHandler(CheckBoxClicked), true);
dt.VisualTree = checkBoxFactory;
column.CellTemplate = dt;
DataGrid.Columns.Add(column);
如果用户单击其中一个复选框,就会调用CheckBoxClicked
方法,并将相应的行值显示为地图上的图标(如前所述)。这个效果很好。然而,用户可以关闭包含数据网格的窗口,而地图与显示的图标一起留在屏幕上。
现在,当用户用数据网格重新打开窗口时,我想根据已经显示的图标来预选复选框。由于复选框没有绑定,我无法将图标与它们匹配。如何做到这一点?有没有一种方法可以通过程序预先选择它们?或者还有办法创建绑定吗?
最后,我找到了解决方案。Hosch250的评论让我走上了正确的轨道(我如何才能对评论投赞成票?)。答案可以在这里找到:代码中的绑定。
以编程方式设置复选框状态的最简单方法是创建以下绑定:
Binding binding = new Binding("IsChecked");
binding.Mode = BindingMode.OneWay;
binding.Source = this;
checkBoxFactory.SetBinding(CheckBox.IsCheckedProperty, binding);
并在当前上下文中实现属性:
public bool IsChecked {
get {
return doWhateverToFindOutIfChecked();
}
}
第一种方法(请参阅我对方法绑定的回答)简单明了。但是,不能真正确定为哪一行调用绑定。我更改了解决方案如下:
我现在使用的不是DataGridTemplateColumn而是DataGridCheckBoxColumn。我的数据动态存储在行中,并使用ListCollectionView绑定到ItemsSource属性。复选框列所需的布尔值会动态插入到行值中。我的数据网格是只读的,选择单位是单元格。设置这些属性后,我可以用鼠标向上事件来检测鼠标在单元格上的点击。在处理程序方法中,我将检查单击是否属于复选框单元格。如果是这样,我会更改行值中相应的布尔值,并调用Items.refresh().