2009-04-16 15 views

Respuesta

2

Esto se basa en la fuente de otra persona que no puedo recordar, pero lo usamos para ayudar a encontrar niños visuales de un tipo. Puede que no sea el uso más eficiente para este escenario, pero podría ayudarlo a ponerse en el camino correcto.

public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
      if (child != null && child is childItem) 
       return (childItem)child; 

      childItem childOfChild = FindVisualChild<childItem>(child); 
      if (childOfChild != null) 
       return childOfChild; 
     } 
     return null; 
    } 

[Editar 04/16/09] Basado en eso, probar este método. Debe encontrar todas las casillas de verificación y cambiar el estado como se proporciona, que se puede llamar desde su controlador de eventos en los eventos marcados/no marcados.

public static void CheckAllBoxes(DependencyObject obj, bool isChecked) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      // If a checkbox, change IsChecked and continue. 
      if (obj is CheckBox) 
      { 
       ((CheckBox) obj).IsChecked = isChecked; 
       continue; 
      } 

      DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
      CheckAllBoxes(child, isChecked); 
     } 
    } 
0

Utilizaría las nuevas funciones de enlace de datos en WPF. Otorgue a todas las casillas de verificación un enlace unidireccional en su propiedad IsChecked, siendo el origen de enlace la propiedad IsChecked de la casilla de verificación maestra.

Otra opción sería utilizar disparadores

7

Esto se puede hacer de forma declarativa. A continuación, se crea una columna de casilla de verificación para cada fila y que puede alternar las selecciones de fila. Se puede hacer clic en el encabezado de la columna de casilla de verificación para seleccionar todas las filas.

porciones relevantes de la xaml

<Window x:Class="Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"> 
    <toolkit:DataGrid Name="dataGrid" 
    ItemsSource="{Binding}" AutoGenerateColumns="True" 
    SelectionMode="Extended" CanResizeRows="False"> 
    <toolkit:DataGrid.RowHeaderTemplate> 
     <DataTemplate> 
      <Grid> 
       <CheckBox IsChecked="{ 
        Binding Path=IsSelected, 
        Mode=TwoWay, 
        RelativeSource={RelativeSource FindAncestor, 
        AncestorType={x:Type toolkit:DataGridRow}}}" 
      /> 
      </Grid> 
     </DataTemplate> 
    </toolkit:DataGrid.RowHeaderTemplate> 
    </toolkit:DataGrid> 
</Window> 
0
DataColumn dt = null;    
     for (int i = 0; i < dataGrid.Columns.Count; i++) 
     { 

    dt = new DataColumn("Column Name"); 

      dt.DataType = typeof(Boolean); 
      dt.DefaultValue = false; 
      dataTable.Add(dt); 
     } 

dataGied.DataContext = dataTable; 



<Custom:DataGrid x:Name="dataGrid" AutoGenerateColumns="True" ItemsSource="{Binding}" />      

Bueno, es sólo una idea aproximada, espero que esto funciona

5

Aquí se muestra la cuadrícula de datos que utilizamos en el archivo XAML 4.0 .Net :

<DataGrid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Name="dgMissingNames" ItemsSource="{Binding Path=TheMissingChildren}" Style="{StaticResource NameListGrid}" SelectionChanged="DataGrid_SelectionChanged"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn CellStyle="{StaticResource NameListCol}"> 
      <DataGridTemplateColumn.HeaderTemplate> 
       <DataTemplate> 
        <CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" /> 
       </DataTemplate>        
      </DataGridTemplateColumn.HeaderTemplate> 
      <DataGridTemplateColumn.CellTemplate>       
       <DataTemplate> 
        <CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged}" Name="theCheckbox"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate>        
     </DataGridTemplateColumn> 
     <DataGridTextColumn Binding="{Binding Path=SKU}" Header="Album" CellStyle="{StaticResource NameListCol}"/> 
     <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" CellStyle="{StaticResource NameListCol}"/> 
     <DataGridTextColumn Binding="{Binding Path=Pronunciation}" Header="Pronunciation" CellStyle="{StaticResource NameListCol}"/> 
    </DataGrid.Columns> 
</DataGrid> 

Aquí está el código detrás:

private void HeadCheck(object sender, RoutedEventArgs e, bool IsChecked) 
{ 
    foreach (CheckedMusicFile mf in TheMissingChildren) 
    { 
     mf.Checked = IsChecked; 
    } 
    dgMissingNames.Items.Refresh(); 
} 

private void CheckBox_Checked(object sender, RoutedEventArgs e) 
{ 
    HeadCheck(sender, e, true); 
} 

private void CheckBox_Unchecked(object sender, RoutedEventArgs e) 
{ 
    HeadCheck(sender, e, false); 
} 

TheMissingChildren es una estructura de objeto simple con algunas propiedades de cadena y un booleano ischecked.

HTH.

+0

si no va a utilizar el objeto emisor o la ruta de desactivación en HeadCheck no debería estar pasándolos en – UrbanEsc

+0

El 'UpdateSourceTrigger = PropertyChanged' me ayuda. Gracias. – AechoLiu

Cuestiones relacionadas