【问题标题】:unchecked any one checkbox of CellTemplate from the list, I want to uncheck the Header Checkbox从列表中取消选中任何一个 CellTemplate 复选框,我想取消选中 Header Checkbox
【发布时间】:2012-04-30 20:04:54
【问题描述】:

我创建了一个包含 4 列的数据表,其中 3 列是字符串,另一列是布尔类型。 我将数据表(xmldatadocument)映射到 wpf 中的 datagridview。 所以结果看起来数据网格中的文本列和复选框列。 我在复选框列标题中添加了一个复选框标题模板。 当 i\header 复选框未选中时,我可以取消选中列中的所有复选框。 当标题 chekcbox 被选中时,我还可以检查列中的所有复选框。但是如果未选中该列中的一个复选框,我也需要取消选中标题复选框。 请帮我解决这个问题.. 我在下面添加了屏幕截图、XAML 和代码。

PS:使用 WPF 数据网格。

<dg:DataGrid.Columns>
                <dg:DataGridCheckBoxColumn Binding="{Binding Check}" Width="50" >
                    <dg:DataGridCheckBoxColumn.HeaderTemplate>
                        <DataTemplate x:Name="dtAllChkBx">
                            <CheckBox Name="cbxAll" Content="{x:Static properties:Resources.lblAll}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"></CheckBox>
                        </DataTemplate>
                    </dg:DataGridCheckBoxColumn.HeaderTemplate>


public static ObservableCollection<Lst> list = new ObservableCollection<Lst>();
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < list.Count; i++)
    {
        list[i].Check = true;
    }
}

private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < list.Count; i++)
    {
        list[i].Check = false;
    }
}

public class Lst : ObservableCollection<Lst>
{
    public bool Check { get; set; }
}  

【问题讨论】:

  • 您是否应该在 Checked 事件上将 check 设置为 true,在 Unchecked 事件上设置为 false?你似乎做了相反的事情。另外,lst 是否绑定到网格中的复选框列?
  • @Dzire 我更正了。是的 lst 绑定到网格中的复选框列。
  • 您是否在绑定到复选框列的属性上调用了属性更改?我试过了。我也绑定了标题复选框并更改了绑定到列的属性。它的工作
  • @Dzire 你能把代码放在这里吗?我也会试试。
  • @user1328637 请在您的班级 Lst 中实现 INotifypropertyChanged 。还可以阅读MVVM 上的内容。您班级中的 Setter Lst 没有 Change notification INotifyPropertyChnaged 会给您一个事件,您可以在 Property Check 的 setter 中提出该事件。是的,在这种情况下,我们通常不使用 `Auto 属性。请更改为带有支持字段的属性。

标签: wpf checkbox wpfdatagrid observablecollection datagridcolumnheader


【解决方案1】:

这是标题的控制模板

<Style x:Key="checkBoxHeaderStyle"
                           TargetType="{x:Type w:DataGridColumnHeader}">
                                                    <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type w:DataGridColumnHeader}">
                                    <CheckBox 
                                              IsChecked="{Binding  Path = IsSelectAllChecked , Mode = TwoWay}"/>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>

这是应用样式的模板列

<w:DataGridTemplateColumn MinWidth="50"
                                              HeaderStyle="{DynamicResource checkBoxHeaderStyle}"
                                              CanUserResize="False">
                        <w:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox Name="selectAllCheckBox"
                                                                  HorizontalAlignment="Center"                                              Margin="1,0,0,0"                                                                                            VerticalAlignment="Center"
                                          IsChecked="{Binding Path = IsSelected, Mode=TwoWay}" />
                            </DataTemplate>
                        </w:DataGridTemplateColumn.CellTemplate>
                    </w:DataGridTemplateColumn>

被选中的属性是

public bool IsSelected
{
    get { return selected; }
    set { selected = value;
    OnPropertyChanged("IsSelected");
    }
}

对于标题复选框

public bool IsSelectAllChecked
        {
            get { return isSelectAllChecked; }
            set
            {
                isSelectAllChecked = value;
                base.OnPropertyChanged("IsSelectAllChecked");
//Call the method which sets the IsSelected property to true of false, based on value
                SetAllCheckBoxesState(value);
            }

    }

希望对你有帮助:)

【讨论】:

  • 如果 lst 没有绑定到网格中的复选框列怎么办?我应该做些什么改变?我已经编辑了我的 XAML 代码...请检查。
  • 检查我的 XAML 和 xaml.cs 代码,然后让我知道我应该对此进行哪些更改。
  • 你必须付出努力,我已经为你提供了一切。
  • 我什么都试过了,但还是不行 :( 没有一个论坛有解决这个问题的方法。:(
  • 希望您将您的复选框列与 Check property n set d mode 绑定为双向,给您复选框列 xaml 代码
猜你喜欢
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 2014-05-04
  • 2017-04-14
相关资源
最近更新 更多