2014-01-29 57 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; 
}