2014-01-29 29 views
1

好吧,这已被问了很多次,但我无法找到正确的解决方案。我有这样的datagrid定义:如何访问datagrid模板列中的复选框?

<DataGrid AutoGenerateColumns="False" 
     IsReadOnly="True" 
     Name="InputDocItemsDataGrid" 
     ItemsSource="{Binding Path= InputItems}" 
     SelectedItem="{Binding Path= InputItem, UpdateSourceTrigger=PropertyChanged}" 
     SelectionChanged="InputDocItemsDataGrid_SelectionChanged" 
     PreviewMouseLeftButtonDown="InputDocItemsDataGrid_PreviewMouseLeftButtonDown"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn CanUserReorder="False" CanUserResize="False"> 
      <DataGridTemplateColumn.HeaderTemplate> 
       <DataTemplate> 
        <CheckBox Name="cbxAll" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" Checked="cbxAll_Checked" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.HeaderTemplate> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <CheckBox Name="cbxSingleRow" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" PreviewMouseLeftButtonDown="cbxSingleRow_PreviewMouseLeftButtonDown" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

嗯,我只在这里添加这个模板列,因为这是兴趣点。所以我试图管理的是访问checkobx“cbxSingleRow”,因为它在数据网格之外,所以我可以用它做所有常规的东西,比如:cbxSingleRow.IsEnabled = false;

那么如何获得该复选框?

+0

“所有的常规的东西” 在WPF通过数据绑定完成。不是程序代码。 –

+0

我意识到这一点,我只需要从代码隐藏中访问该复选框,就像它是datagrid之外的任何其他复选框一样?有没有明确的解决方案来获得这种效果? – Stojdza

+0

'我只需要从代码隐藏中访问该复选框 - 为什么?无论你想做什么,都可以通过DataBinding来完成。 –

回答

1

您可以通过VisualTreeHelper这个课程获得帮助。

在某些工具类中移动此方法,以便可以重复使用。

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj, 
             string name) where T : DependencyObject 
{ 
    if (depObj != null) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
      if (child != null && child is T && 
       (child as FrameworkElement).Name.Equals(name)) 
      { 
      yield return (T)child; 
      } 

      foreach (T childOfChild in FindVisualChildren<T>(child, name)) 
      { 
      yield return childOfChild; 
      } 
     } 
    } 
} 

用法:

foreach (CheckBox checkBox in UtilityFunctions. 
      FindVisualChildren<CheckBox>(InputDocItemsDataGrid, "cbxSingleRow")) 
{   
    checkBox.IsChecked = true; 
}