如何从datagrid模板列访问复选框?

时间:2014-01-29 14:54:47

标签: c# wpf datagrid datagridtemplatecolumn

好的,这已被多次询问,但我找不到合适的解决方案。我有像这样定义的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”,因为它在datagrid之外,所以我可以用它做所有常规的东西,比如:cbxSingleRow.IsEnabled = false;

那么如何获得该复选框?

1 个答案:

答案 0 :(得分: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;
}