Laden...

Binden von TreeViewItem Eigenschaften mit Templates

Erstellt von supermew vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.720 Views
S
supermew Themenstarter:in
9 Beiträge seit 2015
vor 7 Jahren
Binden von TreeViewItem Eigenschaften mit Templates

Hi,
ich habe foldenges TreeView

<controls:TreeViewEx
        x:Name="ItemsTreeView"
        BorderThickness="0"
        VirtualizingStackPanel.IsVirtualizing="True"
        VirtualizingStackPanel.VirtualizationMode="Recycling"
        UseLayoutRounding="True"
        ItemsSource="{Binding Root, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource RootTreeViewConverter}}"
        SelectedItem="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged}">
        <controls:TreeViewEx.Resources>
            <HierarchicalDataTemplate
                DataType="{x:Type models:Folder}"
                ItemsSource="{Binding Items, UpdateSourceTrigger=PropertyChanged}">
                <TextBlock
                    Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"
                    UseLayoutRounding="True" />
            </HierarchicalDataTemplate>
            <DataTemplate
                DataType="{x:Type models:Snippet}">
                <TextBlock
                    Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"
                    UseLayoutRounding="True" />
            </DataTemplate>
        </controls:TreeViewEx.Resources>
</controls:TreeViewEx>

Wie kann ich ein Property der TreeViewItems an ein Property in meinem ViewModel binden?

1.040 Beiträge seit 2007
vor 7 Jahren

Über RelativeSource:

...MyProperty="{Binding DataContext.PropertyAusDemViewModel, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyView}}}"...

Wichtig ist, dass die RelativeSource auf die View geht, erst beim Binding geht man dann an das ViewModel mit DataContext.

...MyProperty="{Binding PropertyAusDemViewModel, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyViewModel}}}"...

Funktioniert nämlich nicht.

S
supermew Themenstarter:in
9 Beiträge seit 2015
vor 7 Jahren

Ich meinte eher das treeviewitem besitzt zB die Eigenschaft "Header" und in meinem ViewModel gibt es die Eigenschaft "CurrentSelectedHeader" wobei "Header" readonly ist und bei auslösen des OnSelected events seinen Wert bekommt. Nun möchte ich "Header" an "CurrentSelectedHeader"binden, so dass das ViewModel die Änderung mitbekommt.

("Header" ist nur ein Beispiel)

1.040 Beiträge seit 2007
vor 7 Jahren

Dafür kannst du doch das SelectedItem nutzen? 🤔

S
supermew Themenstarter:in
9 Beiträge seit 2015
vor 7 Jahren

Bei mir gibt das die objecte zurück, die hinter dem treeview liegen (also zb Folder)

1.040 Beiträge seit 2007
vor 7 Jahren

Ja, und da sollten doch die benötigten Informationen zu finden sein?

Was hast du genau vor?

S
supermew Themenstarter:in
9 Beiträge seit 2015
vor 7 Jahren

Ich möchte das parent element des aktuell markierten TreeViewItems haben

5.299 Beiträge seit 2008
vor 7 Jahren

Bist du dir sicher, dasses das ist, was du möchtest?

Oder möchtest du nicht vielmehr das ParentElement des selektierten Viewmodel-Items haben?

Der frühe Apfel fängt den Wurm.

S
supermew Themenstarter:in
9 Beiträge seit 2015
vor 7 Jahren

Ja aber das über das TreeView

D
985 Beiträge seit 2014
vor 7 Jahren

Aus welchem Grund willst du jetzt dem ViewModel Zugriff auf die View geben?

S
supermew Themenstarter:in
9 Beiträge seit 2015
vor 7 Jahren

Also eigentlich wollte ich nur das parent property des treeviewitem an ein property des viewmodel binden

D
985 Beiträge seit 2014
vor 7 Jahren

Wenn man MVVM einsetzt dann sollte man einen sehr guten Grund haben, wenn man die Grundregeln des Patterns verletzt:

Die View kennt das ViewModel (und evtl. noch das Model). ViewModel kennt das Model. Ende.
Weder hat das ViewModel Kenntnis von der View oder das Model Kenntnis von ViewModel und View.

Warum willst du die Grundregel verletzen? Was willst du mit diesem Parent im ViewModel anfangen?

1.040 Beiträge seit 2007
vor 7 Jahren

Anders gesagt/gefragt:
Du möchtest zum ausgewählten Ordner/Snippet den übergeordneten Ordner haben?

S
supermew Themenstarter:in
9 Beiträge seit 2015
vor 7 Jahren

Ja, genau das

L
136 Beiträge seit 2015
vor 7 Jahren

Hallo Supermew

Du könntest im ViewModel den Parent im Konstruktor übergeben:

In der Form:



    public class ViewModelChild: ViewModel<ModelChild>
    {
        private ViewModelParent _parentChild;
        private ObservableCollection<ViewModelChild> _item;

        public ViewModelChild(ModelChild model, ViewModelParent parentChild) : base(model)
        {
            _parentChild = parentChild;

            _item = new ObservableCollection<ViewModelChild>();
            _item.Add(this);
        }


        public ObservableCollection<ViewModelChild> Item
        {
            get
            {
                return _item;
            }
        }



        public ICommand MoveUp
        {
            get
            {
                return _parentChild.MoveUpChild;
            }
        }

}


Ich vermute, als Grund Deiner Fragestellung, dass es sich dabei um Move, DeepClone, Copy etc. Commands handelt.

Gruss Lhyn