<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的选中状态取消,有什么方法吗?
重新加载数据完成之后,,直接 cbbSelALL.isCheck=false 这样为什么不可以?
问题是现在怎么获取到那个列头的CheckBox,都获取不到谈何来的设置?
@蓝色星尘: 那个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
@蓝色星尘: 不好意思,应该传入DataGrid的实例DG,因为这是在DataGrid的样式里面
FindXAMLChildren.FindChildren<CheckBox>(this.DG)
@Smok: NULL
@蓝色星尘: 其实有一个更加简单的办法,将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属性就好.
这样一定可以的,
@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;
}
这样可以
@蓝色星尘: 其实用绑定是最好的
在数据源中加个IsSelectAll属性
列头的checkbox的IsChecked绑定IsSelectAll。
不行啊