【问题标题】:Are Silverlight DataGrid Checkbox events?Silverlight DataGrid 复选框事件吗?
【发布时间】:2009-02-14 00:53:11
【问题描述】:

是否可以让绑定的 DataGridCheckBoxColumn 调用 click 方法?或者事件一个行级别或行进入事件?

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

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

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

请在下面找到我的 Xaml,它确实没什么特别的。



【问题讨论】:

    标签: silverlight datagrid


    【解决方案1】:

    DataGridCheckBoxColumn 类型当前不提供 Click 事件,实际上它当前不提供任何事件。在此类型的列中呈现的单元格仅在 CheckBox 控件的 IsChecked 属性和 DataGrid 所在的 ObservableCollection 的当前行中 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 中删除此人或更改其属性以过滤或更新 DataGrid。

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

    为避免此错误,请安装 update 或从 DataGrid 行 as per this example 之外的控件启动对 DataGrid 绑定到的 ObservableCollection 的任何操作。

    【讨论】:

    • 感谢您的帮助。这是一种比使用 PreparingCellForEdit 事件更简洁的方法,因为它不需要用户双击。感谢您的帮助。
    • 彼得,请阅读您的答案,这个 Tag="{Binding}" 技巧让我很开心,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2010-12-17
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多