2

是否可以绑定 DataGridCheckBoxColumn 调用单击方法?或事件行级别或行输入事件?

我正在尝试实现一个更新底层过滤的 ObservableCollection 集合的数据网格(这里很棒http://petermcg.wordpress.com/2009/01/29/filtering-silverlight-datagrid-rows/

如果我按下更新按钮或其他外部方法,过滤工作正常。但是,我似乎在 DataGridCheckBoxColumn 上找不到任何内部网格事件或任何允许我调用更新过滤器逻辑的东西。

有关如何实现在按下复选框时更新基础集合的数据网格的任何建议?

请在我的 Xaml 下方查找,它确实没有什么特别之处。



4

1 回答 1

11

DataGridCheckBoxColumn类型当前不提供 Click 事件,实际上它当前不提供任何事件。在此类型的列中呈现的单元格仅在 CheckBox 控件的 IsChecked 属性和 DataGrid 所在的 ObservableCollection<T> 的当前行中 T 的实例上的属性(在 Binding 中指定)之间实现 TwoWay 绑定势必。

您没有提供您的 Xaml,因此我将使用您的问题中引用的我的博客文章中的示例。解决方法包括指定包含 CheckBox 的DataGridTemplateColumn并定义 Click 事件,如下所示:

<data:DataGrid x:Name="FilteredPeople" AutoGenerateColumns="False">
  <data:DataGrid.Columns>
    <data:DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
    <data:DataGridTextColumn Header="Age" Binding="{Binding Age}" />
    <data:DataGridCheckBoxColumn Header="Visible" Binding="{Binding IsVisible}" />

    <data:DataGridTemplateColumn Header="Row Filter">
      <data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <CheckBox x:Name="RowFilterButton" IsChecked="{Binding IsVisible}"
                Content="Filter" Tag="{Binding}" Click="RowFilterButton_Click" />
        </DataTemplate>
      </data:DataGridTemplateColumn.CellTemplate>
    </data:DataGridTemplateColumn>

  </data:DataGrid.Columns>
</data:DataGrid>

在这种情况下,CheckBox 的替代方法可以是 ToggleButton 或普通 Button 控件。注意 CheckBox 的 Tag 属性的绑定。这有助于找出在代码隐藏中单击了 CheckBox 的哪一行:

private void RowFilterButton_Click(object sender, RoutedEventArgs e)
{
    Person person = ((CheckBox)sender).Tag as Person;
}

然后,您可以从 ObservableCollection<T> 中删除此人,或更改其属性以根据需要过滤或更新 DataGrid。

这通常是此答案结束的地方,但如果您没有安装此更新,则 Silverlight 2 DataGrid 的默认 SDK 版本中存在一个错误,该错误会阻止此问题。在这种情况下,如果您在单击该复选框时导致 DataGrid 被过滤(即复选框具有焦点),则该错误将通过 DataGrid 不绘制 CheckBox 所在的行(而不是您得到的看起来像一个不可见的行)来表现出来.

为避免此错误,请安装更新或启动对 DataGrid 绑定到的 ObservableCollection<T> 的任何操作,根据此示例从 DataGrid 行之外的控件。

于 2009-02-14T10:13:03.620 回答