是Silverlight DataGrid Checkbox事件吗?

时间:2009-02-14 00:53:11

标签: silverlight datagrid

是否可以让绑定的DataGridCheckBoxColumn调用click方法?或事件行级或行输入事件?

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

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

有关如何通过复选框实现更新基础集合的数据网格的任何建议吗?

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



1 个答案:

答案 0 :(得分:11)

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

您没有提供您的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&lt; T&gt;中删除此人。或者更改它的属性以根据需要过滤或更新DataGrid。

通常情况下,这个答案会结束,但如果您没有this update installed,则Silverlight 2 DataGrid的默认SDK版本中会有bug来阻止此问题。在这种情况下,如果在单击CheckBox时导致DataGrid被过滤(即Checkbox具有焦点),则DataGrid不会绘制CheckBox所在的行(而不是看起来像是一条不可见的行)

要避免此错误,请安装update或启动对ObservableCollection&lt; T&gt;的任何操作。 DataGrid绑定到DataGrid的行as per this example之外的Control。