2009-04-16 12 views

risposta

2

Questo è basato sulla fonte di qualcun altro che non riesco a ricordare, ma lo usiamo per aiutare a trovare bambini visivi di un tipo. Potrebbe non essere l'uso più efficiente per questo scenario, ma potrebbe aiutarti a portarti sulla strada giusta.

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

[Modifica 4.16.09] Sulla base di ciò, provare questo metodo. Dovrebbe trovare tutti i CheckBox e modificare lo stato come previsto, richiamabile dal gestore eventi sugli eventi selezionati/non selezionati.

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

Vorrei utilizzare le nuove funzionalità di associazione dati in WPF. Assegna a tutte le caselle di controllo un legame unidirezionale sulla loro proprietà IsChecked con l'origine dell'associazione come proprietà IsChecked della casella di controllo principale.

Un'altra opzione sarebbe quella di utilizzare i trigger

7

Questo può essere fatto in modo dichiarativo. Di seguito viene creata una colonna di controllo per ogni riga e che può alternare le selezioni di riga. L'intestazione della colonna checkbox può essere cliccata per fare una selezione di tutte le righe.

porzioni rilevanti dal 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}" />      

Beh, è ​​solo una vaga idea, spero che questo funziona

5

Ecco l'datagrid campione che usiamo nel file 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> 

Ecco il codebehind:

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 è una semplice struttura di oggetti con alcune proprietà stringa e un booleano ischecked.

HTH.

+0

se non si intende utilizzare l'oggetto mittente o il routedeventargs in HeadCheck, non è necessario passarli in – UrbanEsc

+0

"UpdateSourceTrigger = PropertyChanged" mi aiuta. Grazie. – AechoLiu

Problemi correlati