WPF Treeview - Get Status von Kontrollkästchen

stimmen
1

Ich habe eine Treeview erstellt und verwendet, um eine Stapelplatte eine Checkbox, Symbol Bild und Text für jeden Knoten im Baum zu umfassen. Diese Knoten werden zur Laufzeit erstellt. Ich habe auch ein Button-Objekt. Das XAML ist unten.

Das Problem, das ich habe ist, dass, wenn die mich klicken Schaltfläche geklickt wird, muss ich durch die Baumansicht zu durchqueren, und wenn ein Kontrollkästchen aktiviert ist, eine Funktion auszuführen.

Wer weiß, wie, um herauszufinden, ob das Kontrollkästchen für einen Knoten im Baum markiert ist, 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>

Veröffentlicht am 30/06/2009 um 21:57
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
7

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


Bearbeiten (pro Antrag der Person zu fragen):

Hier ist ein Beispiel Ansicht Modell (sehr einfach, die 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 ein Objekt der Umsetzung INotifyPropertyChanged haben, können Sie UI-Element-Eigenschaften an sie binden. So würden Sie das IsChecked Eigentum Ihrer CheckBox, um diese Eigenschaft zu aktualisieren. Um das zu tun, müssen Sie zuerst die Datacontext von Window1 in irgendeiner Weise festgelegt (oder Sie können nur das tun auf dem TreeView selbst als auch). 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 benötigen Sie den aktuell Wert von IsChecked abfragen zu können, müssen Sie es auf diese Weise bekommen kann (vorausgesetzt , dies ist Window1):

((ViewModel)this.DataContext).IsChecked

Ich hoffe, das hilft!

Beantwortet am 30/06/2009 um 22:06
quelle vom benutzer

stimmen
1

Ich denke , Tony Heupel Antwort ist der beste Ansatz, aber zu verstehen , ist es , was Sie über die MVVM (Model-View-Viewmodel) Design - Muster kennen. Ich schlage vor , Sie lesen ausgezeichneten Artikel von Josh Smith

Beantwortet am 06/07/2009 um 20:46
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more