【问题标题】:Click event for DataGridCheckBoxColumnDataGridCheckBoxColumn 的单击事件
【发布时间】:2010-10-20 01:48:01
【问题描述】:

我在 WPF 表单中有一个 DataGrid 和一个 DataGridCheckBoxColumn,但我没有找到任何点击事件,选中和取消选中它...

DataGridCheckBoxColumn 可以参加这些活动吗?如果不是,请提出一些我可以使用的解决方法。

【问题讨论】:

    标签: wpf events datagrid wpfdatagrid


    【解决方案1】:

    在 xml 中试试这个

    <DataGridCheckBoxColumn Header="" IsThreeState="False" Binding="{Binding isCheck, NotifyOnTargetUpdated=True,  UpdateSourceTrigger=PropertyChanged}" />
    

    在c#中

        public partial class UploadWindow : Window
        {
         ObservableCollection<Items> pl = new ObservableCollection<Items>();
        
          class Items
          {
            public bool isCheck { get; set; }
          }
    
          public UploadWindow(Dictionary<string, object> ipDictionary)
          {
            InitializeComponent();
            GridView1.ItemsSource = pl;
          }
         }
    

    就我而言,我需要找到所有选中的复选框

    var allChecked = pl.Where(x => x.isCheck == true);
    

    【讨论】:

      【解决方案2】:

      如果您不想将事件添加到您的样式中,您也可以这样做。

                  <DataGridCheckBoxColumn x:Name="name" Header="name?" Binding="{Path=Name}"
                      <DataGridCheckBoxColumn.CellStyle>
                          <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
                              <EventSetter Event="CheckBox.Checked" Handler="Checked"/>
                          </Style>
                      </DataGridCheckBoxColumn.CellStyle>
                  </DataGridCheckBoxColumn>eckBoxColumn.CellStyle>
              </DataGridCheckBoxColumn>
      

      【讨论】:

        【解决方案3】:

        这里引用 William Han 的回答:http://social.msdn.microsoft.com/Forums/ar/wpf/thread/9e3cb8bc-a860-44e7-b4da-5c8b8d40126d

        它只是将一个事件添加到列中。这是一个很好的简单解决方案。

        也许您可以使用EventSetter 如下示例:

        标记:

        <Window x:Class="DataGridCheckBoxColumnTest.MainWindow"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:DataGridCheckBoxColumnTest"
                Title="MainWindow" Height="350" Width="525">
            <Window.Resources>
                <local:People x:Key="People"/>
            </Window.Resources>
            <Grid>
                <DataGrid ItemsSource="{StaticResource People}" AutoGenerateColumns="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name"/>
                        <DataGridCheckBoxColumn Binding="{Binding Path=LikeCar}" Header="LikeCar">
                            <DataGridCheckBoxColumn.CellStyle>
                                <Style>
                                    <EventSetter Event="CheckBox.Checked" Handler="OnChecked"/>
                                </Style>
                            </DataGridCheckBoxColumn.CellStyle>
                        </DataGridCheckBoxColumn>
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>
        </Window>
        

        代码:

        using System;
        using System.Windows;
        
        namespace DataGridCheckBoxColumnTest
        {
            /// <summary>
            /// Interaction logic for MainWindow.xaml
            /// </summary>
            public partial class MainWindow : Window
            {
                public MainWindow()
                {
                    InitializeComponent();
                }
        
                void OnChecked(object sender, RoutedEventArgs e)
                {
                    throw new NotImplementedException();
                }
            }
        }
        
        
        namespace DataGridCheckBoxColumnTest
        {
            public class Person
            {
                public Person(string name, bool likeCar)
                {
                    Name = name;
                    LikeCar = likeCar;
                }
                public string Name { set; get; }
                public bool LikeCar { set; get; }
            }
        }
        
        using System.Collections.Generic;
        
        namespace DataGridCheckBoxColumnTest
        {
            public class People : List<Person>
            {
                public People()
                {
                    Add(new Person("Tom", false));
                    Add(new Person("Jen", false));
                }
            }
        }
        

        【讨论】:

          【解决方案4】:

          这样的事情怎么样。

          partial class SomeAwesomeCollectionItems : INotifyPropertyChanged
          {
              public event PropertyChanged;
              protected void OnPropertyChanged(string property)
              {
                  if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(property);
              }
          
              private bool _IsSelected;
              public bool IsSelected { get { return _IsSelected; } set { _IsSelected = Value; OnPropertyChanged("IsSelected"); } }
          }
          

          然后在 XAML 中

          <DataGrid ItemsSource="{Binding Path=SomeAwesomeCollection"} SelectionMode="Single">
              <DataGrid.Resources>
                  <Style TargetType="{x:Type DataGridRow}"
                         BasedOn="{StaticResource {x:Type DataGridRow}}">
                  <!--Note that you will probably need to base on other style if you have stylized your DataGridRow-->
                      <Setter Property="IsSelected" Value="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" />
                  </Style>
              </DataGrid.Resources
              <DataGrid.Columns>
                  <DataGridCheckBoxColumn Binding="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" />
                  <!--More Columns-->
              </DataGrid.Columns>
          </DataGrid>
          

          但是,使用这种方法的一个注意事项是,您可能会遇到虚拟化问题并且检查项目未清除(不确定,尚未使用 SelectionMode="Single" 进行测试)。如果是这种情况,我发现最简单的解决方法是关闭虚拟化,但也许有更好的方法来解决这个特定问题。

          【讨论】:

            【解决方案5】:
            <wpf:DataGridCheckBoxColumn Header="Cool?" Width="40" Binding="{Binding IsCool}"/>
            

            【讨论】:

              【解决方案6】:

              扩展上面提到的 DataGridCell 概念,这是我们用来让它工作的。

              ...XAML...

                  <DataGrid Grid.ColumnSpan="2" Name="dgMissingNames" ItemsSource="{Binding Path=TheMissingChildren}" Style="{StaticResource NameListGrid}" SelectionChanged="DataGrid_SelectionChanged">
                      <DataGrid.Columns>
                          <DataGridTemplateColumn CellStyle="{StaticResource NameListCol}">
                              <DataGridTemplateColumn.CellTemplate>
                                  <DataTemplate>
                                      <CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged}" Name="theCheckbox" />
                                  </DataTemplate>
                              </DataGridTemplateColumn.CellTemplate>                            
                          </DataGridTemplateColumn>
                          <DataGridTextColumn Binding="{Binding Path=SKU}" Header="Album" />
                          <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" "/>
                          <DataGridTextColumn Binding="{Binding Path=Pronunciation}" Header="Pronunciation" />
                      </DataGrid.Columns>
                  </DataGrid>
              

              TheMissingChildren 是一个 ObservableCollection 对象,其中包含数据元素列表,其中包括我们用来填充数据网格的布尔字段“Checked”。

              此处的 SelectionChanged 代码将在底层 TheMissingChildren 对象中设置选中的布尔值并触发项目列表的刷新。这样可以确保无论您在何处单击该行,该框都会被选中并显示新状态。单击复选框或行中的某处将打开/关闭检查。

              private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
              {
                  DataGrid ThisGrid = (DataGrid)sender;
                  CheckedMusicFile ThisMusicfile = (CheckedMusicFile)ThisGrid.SelectedItem;
                  ThisMusicfile.Checked = !ThisMusicfile.Checked;
                  ThisGrid.Items.Refresh();
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-10-03
                • 1970-01-01
                • 1970-01-01
                • 2020-12-27
                • 2011-06-05
                • 1970-01-01
                • 1970-01-01
                • 2017-04-09
                相关资源
                最近更新 更多