WPF datagrid - 如何在模板列中设置复选框而不绑定?

时间:2016-07-21 19:29:30

标签: c# wpf templates checkbox datagrid

我有一个数据网格,它以编程方式填充从网络服务中检索到的数据。 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重新打开窗口时,我想根据已经显示的图标预先选中该复选框。由于复选框没有绑定,我无法将图标与它们匹配。 如何才能做到这一点?有没有办法以编程方式预先选择它们?或者还有办法创建绑定吗?

2 个答案:

答案 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()。