我有一个数据网格,它以编程方式填充从网络服务中检索到的数据。 datagrid的最后一列包含复选框,允许在地图上显示每个行的值。该列使用如下模板列创建:
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
方法并在地图上将相应的行值显示为图标(如上所述)。这非常有效。但是,用户可以关闭包含数据网格的窗口,而地图会与显示的图标一起保留在屏幕上。
现在,当用户使用datagrid重新打开窗口时,我想根据已经显示的图标预先选中该复选框。由于复选框没有绑定,我无法将图标与它们匹配。 如何才能做到这一点?有没有办法以编程方式预先选择它们?或者还有办法创建绑定吗?
答案 0 :(得分:0)
最后,我找到了解决方案。 Hosch250s评论引导我走上正轨(我怎样才能对评论进行评论?)。答案可以在这里找到:binding in code。
以编程方式设置复选框状态的最简单方法是创建此绑定:
Binding binding = new Binding("IsChecked");
binding.Mode = BindingMode.OneWay;
binding.Source = this;
checkBoxFactory.SetBinding(CheckBox.IsCheckedProperty, binding);
在当前上下文中实现该属性:
public bool IsChecked {
get {
return doWhateverToFindOutIfChecked();
}
}
答案 1 :(得分:0)
第一种方法(参见我使用方法绑定的答案)很简单而且前进。但是,无法确定绑定被调用的行。我改变了如下所示的解决方案:
而不是DataGridTemplateColumn我现在正在使用DataGridCheckBoxColumn。我的数据使用ListCollectionView动态存储在行中并绑定到ItemsSource属性。复选框列所需的布尔值将动态插入到行值中。我的数据网格是只读的,选择单元是单元格。设置这些属性,我可以使用MouseUp事件来检测鼠标单击一个单元格。在处理程序方法中,我将检查点击是否属于复选框单元格。如果是这样,我在行值中更改相应的布尔值并调用Items.refresh()。