2009-06-30 12 views
1

Ich habe eine Treeview erstellt und verwendet ein Stack-Panel, um ein Kontrollkästchen, Symbolbild und Text für jeden Knoten in der Struktur enthalten. Diese Knoten werden zur Laufzeit erstellt. Ich habe auch ein Button-Objekt. Das Xaml ist unten.WPF Treeview - Get Status der Checkbox

Das Problem, das ich habe, ist, dass, wenn der Klick mich Taste angeklickt wird, ich durch die Baumansicht durchlaufen muss und wenn ein Kontrollkästchen aktiviert ist, eine Funktion ausführen.

Kann jemand herausfinden, ob das Kontrollkästchen für einen Knoten in der Struktur überprüft wird, aus dem C# -Code hinter ???

<Window x:Class="WPF_Explorer_Tree.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:WPF_Explorer_Tree" 
Title="KryptoG" Height="424" Width="815" Loaded="Window_Loaded"> 
<Window.Resources> 
    <local:HeaderConverter x:Key="formatter" /> 
</Window.Resources> 
<Grid> 
    <TreeView x:Name="foldersItem" SelectedItemChanged="foldersItem_SelectedItemChanged" Background="#FFFFFFFF" BorderBrush="#FFFFFFFF" Foreground="#FFFFFFFF" Margin="0,0,236,112" AllowDrop="True" Visibility="Visible"> 
     <TreeView.Resources> 
      <Style TargetType="{x:Type TreeViewItem}"> 
       <Setter Property="HeaderTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
          <StackPanel Name="ST" Orientation="Horizontal"> 
           <CheckBox VerticalAlignment="Center" Name="SelectedCheckBox" IsChecked="False" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" /> 
          <Image Name="img" Width="20" Stretch="Fill" 
            Source="{Binding 
            RelativeSource={RelativeSource 
            Mode=FindAncestor, 
            AncestorType={x:Type TreeViewItem}}, 
            Path=Header, 
            Converter={x:Static local:HeaderToImageConverter.InstanceIcon}}"  
            /> 
           <TextBlock VerticalAlignment="Center" Text="{Binding 
            RelativeSource={RelativeSource 
            Mode=FindAncestor, 
            AncestorType={x:Type TreeViewItem}}, 
            Path=Header, 
            Converter={StaticResource formatter}}" 
            /> 
          </StackPanel> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </TreeView.Resources> 
    </TreeView> 
    <TreeView HorizontalAlignment="Right" Margin="0,0,12,12" Name="treeView1" Width="204" AllowDrop="True" BorderBrush="White" Foreground="White" /> 
    <Button Height="23" HorizontalAlignment="Left" Margin="12,0,0,70" Name="button1" VerticalAlignment="Bottom" Width="75" Click="button1_Click">Click Me</Button> 
    <Button Height="23" HorizontalAlignment="Left" Margin="267,0,0,69" Name="button2" VerticalAlignment="Bottom" Width="75" Click="button2_Click">Click Me too</Button> 
</Grid> 

+0

Welche Elemente setzen Sie in Ihrem TreeView? –

+0

TreeViewItems. Ist das die Antwort? Wenn nicht, lassen Sie mich wissen, welche anderen Informationen Sie benötigen. – trainer

Antwort

7

Ich würde stattdessen mit dieser Bindung Checkbox IsChecked Eigenschaft auf ein Ansichtsmodell Objekt ein Zwei-Wege-Daten erstellen. Viel einfacher als der Baum zu navigieren.


bearbeiten (pro Antrag der Person zu fragen):

Hier ist ein Beispiel Ansicht Modell (sehr einfach, dass nur für die IsChecked Eigenschaft Buchhaltung):

public class ViewModel : System.ComponentModel.INotifyPropertyChanged 
{ 
    private bool? _isChecekd; 
    public bool? IsChecked 
    { 
     get { return _isChecekd; } 
     set 
     { 
      if (_isChecekd != value) 
      { 
       _isChecekd = value; 
       if (PropertyChanged != null) 
       { 
        PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("IsChecked")); 
       } 
      } 
     } 
    } 
    #region INotifyPropertyChanged Members 
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 
    #endregion 
} 

Nun, da Sie Wenn Sie ein Objekt implementieren, das INotifyPropertyChanged implementiert, können Sie die Eigenschaften von UI-Elementen an sie binden. Sie würden also die IsChecked-Eigenschaft Ihrer CheckBox auf diese Eigenschaft aktualisieren. Um das zu tun, müssen Sie zuerst den DataContext von Window1 auf irgendeine Weise setzen (oder Sie können dies auch auf dem TreeView selbst tun). In Ihrem Window1.xaml.cs:

public Window1() 
     { 
      InitializeComponent(); 
      this.DataContext = new ViewModel(); 
     } 

Dann in Ihrer Window1.xaml Datei, aktualisieren Sie die CheckBox IsChecked Eigenschaft:

<CheckBox VerticalAlignment="Center" Name="SelectedCheckBox" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" /> 

Und dann, in welchem ​​Code, den Sie in der Lage sein müssen, befragen die zur Zeit Wert von IsChecked, können Sie es auf diese Weise erhalten (diesen unter der Annahme Window1):

((ViewModel)this.DataContext).IsChecked 

Hoffnung, das hilft!

1

Ich denke Tony Heupels Antwort ist der beste Ansatz, aber um es zu verstehen, müssen Sie über das MVVM (Model-View-ViewModel) Entwurfsmuster Bescheid wissen. Ich schlage vor, Sie lesen excellent article by Josh Smith