首页 新闻 搜索 专区 学院

WPF DataGrid DataGridTemplateColumn 中的列头CheckBox怎么在代码取消选中

0
悬赏园豆:20 [待解决问题]

<DataGrid Name="DG">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Width="70">
                        <DataGridTemplateColumn.HeaderTemplate>
                            <DataTemplate>
                                <CheckBox Name="cbbSelALL" Content="全选" Click="cbbSelALL_Click"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.HeaderTemplate>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding SelFlag}" Name="cbsel"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

      </DataGrid.Columns>
</DataGrid>

代码如上; 当我选中列头的CheckBox后,我重新查询绑定数据时需要将列头的CheckBox的选中状态取消,有什么方法吗?

 

蓝色星尘的主页 蓝色星尘 | 初学一级 | 园豆:182
提问于:2014-04-17 14:15
< >
分享
所有回答(2)
0

重新加载数据完成之后,,直接 cbbSelALL.isCheck=false 这样为什么不可以?

PeterQuinn | 园豆:4 (初学一级) | 2014-04-17 15:09

问题是现在怎么获取到那个列头的CheckBox,都获取不到谈何来的设置?

支持(0) 反对(0) 蓝色星尘 | 园豆:182 (初学一级) | 2014-04-17 15:13

@蓝色星尘: 那个checkbox是在样式里面,直接用this. 这样点不出来,试试用VisualTreeHelper来循环搜索它出来.

public class FindXAMLChildren     {         public static IEnumerable<T> FindChildren<T>(DependencyObject parent) where T : class         {             var count = VisualTreeHelper.GetChildrenCount(parent);             if (count > 0)             {                 for (var i = 0; i < count; i++)                 {                     var child = VisualTreeHelper.GetChild(parent, i);                     var t = child as T;                     if (t != null)                         yield return t;

                    var children = FindChildren<T>(child);                     foreach (var item in children)                         yield return item;                 }             }         }     }

 

 

调用的时候你传入你有这个checkbox页面的this,

FindXAMLChildren.FindChildren<CheckBox>(this)

调试看看能不能找到那个checkbox

 

支持(0) 反对(0) PeterQuinn | 园豆:4 (初学一级) | 2014-04-17 15:22

@蓝色星尘: 不好意思,应该传入DataGrid的实例DG,因为这是在DataGrid的样式里面

FindXAMLChildren.FindChildren<CheckBox>(this.DG)

支持(0) 反对(0) PeterQuinn | 园豆:4 (初学一级) | 2014-04-17 15:24

@Smok: NULL

支持(0) 反对(0) 蓝色星尘 | 园豆:182 (初学一级) | 2014-04-17 16:07

@蓝色星尘: 其实有一个更加简单的办法,将CheckBox的IsCheck属性绑定到ViewModel的属性里面,如果你没有用到MVVM模式的话,你可以用最原始的办法,

先在代码文件中定义一个bool的属性

        private bool isTBCheck = true;
        public bool IsTBCheck
        {
            get { return isTBCheck; }
            set { isCheck= value; RaisePropertyChanged("IsTBCheck"); }
        }

 

然后你先将DataGrid的DataContext=this,赋值到整个代码文件中,

你的就是DG.DataContext=this;

然后在xaml文件里面,

<CheckBox Name="cbbSelALL" Content="全选" Click="cbbSelALL_Click"/>这里,

加入一个绑定

IsChecked="{Binding IsTBCheck, Mode=TwoWay}"

然后你控制IsTBCheck属性就好.

这样一定可以的,

支持(0) 反对(0) PeterQuinn | 园豆:4 (初学一级) | 2014-04-17 16:20

@Smok: 

public T GetVisualChild<T>(DependencyObject parent, Func<T, bool> predicate) where T : Visual
{
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
DependencyObject v = (DependencyObject)VisualTreeHelper.GetChild(parent, i);
T child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v, predicate);
if (child != null)
{
return child;
}
}
else
{
if (predicate(child))
{
return child;
}
}
}
return null;
}

 

 

CheckBox chb = GetVisualChild<CheckBox>(DG, v => v.Name == "cbbSelALL");
if (null != chb)
{
chb.IsChecked = false;
}

 

 

这样可以

支持(0) 反对(0) 蓝色星尘 | 园豆:182 (初学一级) | 2014-04-17 17:25

@蓝色星尘: 其实用绑定是最好的

支持(0) 反对(0) PeterQuinn | 园豆:4 (初学一级) | 2014-04-17 17:35
0

在数据源中加个IsSelectAll属性

列头的checkbox的IsChecked绑定IsSelectAll。

德年 | 园豆:805 (小虾三级) | 2014-04-17 15:47

不行啊

支持(0) 反对(0) 蓝色星尘 | 园豆:182 (初学一级) | 2014-04-17 16:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册