2009-04-16 9 views

Antwort

2

Dies basiert auf der Quelle von jemand anderem, die ich nicht erinnern kann, aber wir verwenden es, um visuelle Kinder eines Typs zu finden. Es ist möglicherweise nicht die effizienteste Verwendung für dieses Szenario, aber es könnte helfen, Sie auf dem richtigen Weg zu bekommen.

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

[Edit 4.16.09] auf dieser Grundlage, versuchen Sie diese Methode aus. Sollte alle CheckBoxes finden und den Status ändern, der von Ihrem Event-Handler bei den Checked/Unchecked-Ereignissen aufgerufen werden kann.

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

Ich würde die neuen Datenbindungsfunktionen in WPF verwenden. Weisen Sie allen Kontrollkästchen eine unidirektionale Bindung für ihre IsChecked-Eigenschaft zu, wobei die Bindungsquelle die IsChecked-Eigenschaft des Master-Kontrollkästchens ist.

Eine andere Möglichkeit wäre, zu verwenden, löst

7

Diese deklarativ getan werden kann. Im Folgenden wird für jede Zeile eine Kontrollkästchenspalte erstellt, die die Zeilenauswahl umschalten kann. Der Header der Checkbox-Spalte kann angeklickt werden, um alle Zeilen auszuwählen.

Relevante Teile aus dem 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}" />      

Nun, es nur eine grobe Idee, hoffe das funktioniert

5

Hier wird die Probe Datagrid wir in der .Net 4.0 XAML-Datei verwenden :

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

Hier ist der 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 ist eine einfache Objektstruktur mit einigen String-Eigenschaften und einem ichecked boolean.

HTH.

+0

Wenn Sie nicht das Absenderobjekt oder die routedeventargs in HeadCheck verwenden, sollten Sie sie nicht in – UrbanEsc

+0

übergeben Die 'UpdateSourceTrigger = PropertyChanged 'hilft mir. Vielen Dank. – AechoLiu