WPF Treeview - Get status van checkbox

stemmen
1

Ik heb een Treeview gemaakt en gebruikt een stapel paneel om het pictogram van een checkbox, en de tekst voor elk knooppunt in de boom te nemen. Deze knooppunten zijn gemaakt tijdens de uitvoering. Ik heb ook een knop object. De xaml staat hieronder.

Het probleem dat ik heb is dat, wanneer de click me knop wordt geklikt, ik moet doorkruisen via de boomstructuur en als een checkbox is aangevinkt, voert u een functie.

Weet iemand hoe om te achterhalen of het selectievakje voor een knooppunt in de boom wordt gecontroleerd, vanaf de C # code achter ???

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

De vraag is gesteld op 30/06/2009 om 21:57
bron van user
In andere talen...                            


2 antwoorden

stemmen
7

Ik zou een twee-weg data binding met dat maken controleren IsChecked woning Box om een ​​ViewModel object plaats. Veel gemakkelijker dan de boom navigeren.


Bewerken (per verzoek van de aanvrager):

Hier is een voorbeeld bekijken Model (heel simpel dat alleen is goed voor de IsChecked eigendom):

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
}

Nu dat je een object implementeren INotifyPropertyChanged, kunt u UI-element eigenschappen aan zich te binden. Dus je zou het IsChecked woning van uw CheckBox om deze eigenschap te werken. Om dat te doen, moet u eerst de DataContext van Window1 ingesteld op een bepaalde manier (of je kan dit enkel doen op het TreeView zelf ook). In je Window1.xaml.cs:

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

Dan, in uw Window1.xaml bestand, het actualiseren van de CheckBox IsChecked eigenschap:

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

En dan, in welke code moet je in staat zijn om de huidige waarde van IsChecked ondervragen, dat je het kunt krijgen op deze manier (ervan uitgaande dat dit is Window1):

((ViewModel)this.DataContext).IsChecked

Hoop dat het helpt!

antwoordde op 30/06/2009 om 22:06
bron van user

stemmen
1

Ik denk dat Tony Heupel antwoord is de beste aanpak, maar om te begrijpen wat u moet weten over de MVVM (Model-View-ViewModel) ontwerp patroon. Ik stel voor dat je dit leest uitstekend artikel van Josh Smith

antwoordde op 06/07/2009 om 20:46
bron van user

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