2009-04-16 8 views

Répondre

2

Ceci est basé sur la source de quelqu'un d'autre que je ne me souviens pas, mais nous l'utilisons pour aider à trouver des enfants visuels d'un type. Ce n'est peut-être pas l'utilisation la plus efficace pour ce scénario, mais cela pourrait vous aider à vous mettre sur la bonne voie.

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; 
    } 

[Modifier 16.04.09] Sur cette base, essayer cette méthode. Doit trouver toutes les cases à cocher et modifier l'état tel qu'il est fourni, appelable à partir de votre gestionnaire d'événements sur les événements Checked/Unchecked.

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

J'utiliserais les nouvelles fonctionnalités de liaison de données dans WPF. Donnez à toutes les cases à cocher une liaison unidirectionnelle sur leur propriété IsChecked avec la source de liaison étant la propriété IsChecked de la case à cocher principale.

Une autre option serait d'utiliser des déclencheurs

7

Cela peut être fait déclarative. Ce qui suit crée une colonne de case à cocher pour chaque ligne et qui peut basculer les sélections de ligne. L'en-tête de la colonne checkbox peut être cliqué pour faire une sélection de toutes les lignes.

parties pertinentes 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}" />      

Eh bien, il est juste une vague idée, espérons que cela fonctionne

5

Voici l'échantillon DataGrid que nous utilisons dans le .Net 4.0 fichier XAML :

<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> 

Voici le codebehind:TheMissingChildren est une structure d'objet simple avec quelques propriétés de chaîne et un booléen ischecked.

HTH.

+0

Si vous n'utilisez pas l'objet expéditeur ou routedeventargs dans HeadCheck vous ne devriez pas les transmettre – UrbanEsc

+0

Le 'UpdateSourceTrigger = PropertyChanged' m'aide. Merci. – AechoLiu

Questions connexes