【问题标题】:WPF datagrid - how to set checkbox in template column without binding?WPF datagrid - 如何在模板列中设置复选框而不绑定?
【发布时间】:2016-11-25 13:15:59
【问题描述】:

我有一个数据网格,它由从 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 方法并将相应的行值显示为地图上的图标(如前所述)。这很好用。但是,用户可以关闭包含数据网格的窗口,而地图与显示的图标一起留在屏幕上。

现在,当用户重新打开带有数据网格的窗口时,我想根据已经显示的图标预先选择复选框。由于复选框没有绑定,我无法将图标与它们匹配。 如何才能做到这一点?有没有办法以编程方式预选它们?还是有办法创建绑定?

【问题讨论】:

  • 请,请,请使用 XAML 设置您的 UI。
  • 我已经有一段时间没有这样做了,但是您可以设置的每个复选框上都应该有一个 IsChecked 属性,类似于 WinForms 样式。否则,我建议您使用 XAML 来设置您的 UI 并使用简单的方法绑定。
  • 好的,谢谢。但内容是高度动态的,无法使用 XAML 进行设置。

标签: c# wpf templates checkbox datagrid


【解决方案1】:

终于,我找到了解决方案。 Hosch250 的评论让我走上了正确的道路(我怎样才能支持评论?)。答案可以在这里找到: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();
    }
}

【讨论】:

    【解决方案2】:

    第一种方法(请参阅我的方法绑定的答案)简单且严格。但是,无法真正确定调用绑定是针对哪一行。我已将解决方案更改如下:

    我现在使用的是 DataGridCheckBoxColumn,而不是 DataGridTemplateColumn。我的数据使用 ListCollectionView 动态存储在行中并绑定到 ItemsSource 属性。复选框列所需的布尔值被动态插入到行值中。我的数据网格是只读的,选择单元是单元格。设置这些属性,我可以使用 MouseUp 事件来检测鼠标单击单元格。在处理程序方法中,我将检查单击是否属于复选框单元格。如果是这样,我更改行值中相应的布尔值并调用 Items.refresh()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 2016-01-13
      • 2019-06-05
      • 1970-01-01
      相关资源
      最近更新 更多