【发布时间】:2011-06-14 06:36:21
【问题描述】:
我有一个数据网格,其标题列之一是三态复选框。该列的单元格模板包含两个状态复选框 + 所有项目复选框 - 项目 1 - 项目2 - 项目 3 .. 我想使用 AllItems 复选框来选择/取消选择所有工作正常的项目(item1,item2)。接下来,当并非所有项目都被选中/取消选中时,我想将 AllItems 复选框设置为中间状态。同样,当手动选择所有项目时,我想将 AllItems 复选框设置为选中/未选中。
这是我尝试过的代码...
<dg:DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<StackPanel x:Name="StackPanelForItemCheckbox" Orientation="Horizontal">
<CheckBox x:Name="AllItemSelectionCheckBox" HorizontalAlignment="Left" Cursor="Hand"
IsChecked="{Binding IsAllItemChecked, Mode=TwoWay}"
IsThreeState="True" Checked="ItemSelectionCheckBox_Checked"
Unchecked="ItemSelectionCheckBox_Unchecked"
Click="AllItemSelectionCheckBox_Click">
<TextBlock x:Name="ItemNameTextBlock" Text="Item" Margin="10,0,0,0">
......
<dg:DataGridTemplateColumn.CellTemplate>
<DataTemplate x:Name="ItemCheckDataTemplate">
<StackPanel x:Name="ItemCheckBoxStackPanel" Orientation="Horizontal">
<CheckBox x:Name="itemCheckBox" Cursor="Hand" IsChecked="{Binding IsItemChecked, Mode=TwoWay}" Click="ItemSelectionCheckBox_Click"></CheckBox>
<TextBlock x:Name="ItemNameTextBlock" Text="{Binding Path=Item}"> </TextBlock>
</StackPanel>
</DataTemplate>
...
“ItemSelectionCheckBox_Click”方法查找所有三种状态(全部选中、未选中、中间)并设置“IsAllItemChecked”属性,即 INotifyproperty。这是行不通的。我可能会尝试的其他替代方法是找到“AllItems”元素并从代码中设置它。在网上找不到类似的东西。例子很少,但适用于 TreeView 而不是我尝试的方式。有什么帮助吗?
PS>>
已更新修复以关闭此帖子。
-
我想要的第一件事是允许“AllItemSelectionCheckBox”在手动选择时只有两种状态(True、False)。
private void AllItemSelectionCheckBox_Click(object sender, RoutedEventArgs e) { var cb = e.Source as CheckBox; if (!cb.IsChecked.HasValue) cb.IsChecked = false; } - 我希望“AllItemSelectionCheckBox”复选框显示三态直通代码。
- 选中的所有复选框都会使其值为 TRUE
- 所有未选中的复选框都将导致其值为 FALSE
- 任何少数选择都会导致其值为 NULL。
代码示例如下:
private void itemCheckBox_Checked(object sender, RoutedEventArgs e)
{
DataGridRowsPresenter DGRPresenter = FindVisualChild<DataGridRowsPresenter>(DataGName1);
if (DGRP == null || DGRP.Children == null)
return null;
foreach (object obj in UIEC)
{
DGR = obj as Microsoft.Windows.Controls.DataGridRow;
UIC = DGR.Item as <datagrid mapped data model>;
if (DGR.IsSelected == true)
UIC.IsItemChecked = true;
if (UIC.IsItemChecked == true)
NumberOfItemsChecked++;
}
if (NumberOfItemsChecked == myViewModelAllItems.Count)
{
allcheckbox.IsChecked = true;
}
else if (NumberOfItemsChecked < myViewModelAllItems.Count)
{
allcheckbox.IsChecked = null; //intermittent state
}
}
由于竞争条件破坏了外部值,全局更新 NumberOfItemsChecked 计数无效。
注意: 上面的代码更像是一个示例,直接复制可能无法正常工作。我可以根据要求提供完整的代码和示例。
【问题讨论】:
标签: wpf wpf-controls checkbox wpfdatagrid