【问题标题】:Multicheck DataGridCheckBoxColumns多重检查 DataGridCheckBoxColumn
【发布时间】:2015-12-13 05:06:00
【问题描述】:

我是 WPF 新手,遇到了这个问题:

我想为“点击”列中的选定行启用对我的 DataGridComboBoxColumns 的多重检查/取消检查。

我的 DataGrid 看起来像

<DataGrid ItemsSource="{Binding SelectedListRTEntity.Properties}"
      AutoGenerateColumns="False"
      CanUserAddRows="False"
      CanUserDeleteRows="False"
      >
<DataGrid.Columns>
    <DataGridTextColumn Header="ID" Visibility="Hidden" Binding="{Binding ID}" />
    <DataGridCheckBoxColumn Header="Generate" Width="100" Binding="{Binding Generate}" />
    <DataGridTextColumn Header="Name" Width="100" Binding="{Binding Name}" />
    <DataGridCheckBoxColumn Header="Is nullable" Width="100" Binding="{Binding IsNullable}" />
    <DataGridTextColumn Header="Basic type" Width="100" Binding="{Binding BasicType}" />
    <DataGridCheckBoxColumn Header="UseCustomGetterSetter" Width="100" Binding="{Binding UseCustomGetterSetter}" /> 
</DataGrid.Columns>

非常重要的是,多重检查检查右列中的复选框。

我不知道如何处理这个问题。 有没有办法在没有代码隐藏的情况下解决这个问题?

编辑:也许这张截图有助于澄清我的意思:

首先选择我想用 SHIFT 取消选中的行并单击

然后在其中一个复选框中使用 SHIFT + 单击取消选中它们

【问题讨论】:

  • 多重检查是什么意思?您是否想说列标题有一个复选框,并且检查它将检查该列中的所有复选框。请澄清。
  • 不,我不需要列标题中的复选框。我想通过 Shift + 单击来检查/取消选中多行。我在帖子中添加了一些屏幕截图以阐明我的意思

标签: wpf xaml datagrid


【解决方案1】:

不写代码是不可能达到预期效果的。您需要将属性绑定到 Checkbox 才能收到通知。因此,为这些属性实现 INotifyPropertyChanged。

在进行以下更改后,当我选中/取消选中任何选定行中的任何“生成”复选框时,“生成”字段的所有复选框对选定行的作用相同。未选择的行保持不受影响。

  <DataGrid x:Name="myGrid" ItemsSource="{Binding SelectedListRTEntity.Properties}"
        AutoGenerateColumns="False"
        CanUserAddRows="False"
        CanUserDeleteRows="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Visibility="Hidden" Binding="{Binding ID}" />

            <DataGridTemplateColumn Width="100" Header="Generate">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox  IsChecked="{Binding Generate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                                   Checked="GenerateCheckBox_Checked" Unchecked="GenerateCheckBox_Unchecked"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTextColumn Header="Name" Width="100" Binding="{Binding Name}" />
            <DataGridCheckBoxColumn Header="Is nullable" Width="100" Binding="{Binding IsNullable}" />
            <DataGridTextColumn Header="Basic type" Width="100" Binding="{Binding BasicType}" />
            <DataGridCheckBoxColumn Header="UseCustomGetterSetter" Width="100" Binding="{Binding UseCustomGetterSetter}" />
        </DataGrid.Columns>
    </DataGrid>

你的属性类:

    public class Property:INotifyPropertyChanged
    {
       public String ID { get; set; }

       public String Name { get; set; }
       public bool IsNullable { get; set; }
       public String BasicType { get; set; }
       public bool UseCustomGetterSetter { get; set; }

       private bool _generate;
       public bool Generate { 
           get { return _generate; } 
           set { _generate = value; OnPropertyChanged(this, new PropertyChangedEventArgs("Generate"));  } 
       }

       public event PropertyChangedEventHandler PropertyChanged;
       void OnPropertyChanged(Object sender, PropertyChangedEventArgs e) {
           if (PropertyChanged != null)
               PropertyChanged(this, e);
       }
    }

在代码隐藏中

        private void GenerateCheckBox_Checked(object sender, RoutedEventArgs e)
        {

            IList items = myGrid.SelectedItems;

            foreach (Property p in items) 
            {
                p.Generate = true; 
            } 
        } 

        private void GenerateCheckBox_Unchecked(object sender, RoutedEventArgs e)
        {

            IList items = myGrid.SelectedItems;

            foreach (Property p in items)
            {
                p.Generate = false;
            } 
        }

【讨论】:

    【解决方案2】:

    要实现这一点,您可以在列标题中添加一个复选框,然后将其命令绑定到 viewmodel 命令。

    该命令处理程序会将所有项目的属性设置为您想要的任何内容。

    通读thisthis 以获得更好的想法。

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 2011-09-20
      • 2018-06-20
      • 1970-01-01
      相关资源
      最近更新 更多