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?
Ü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.
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)
Bei mir gibt das die objecte zurück, die hinter dem treeview liegen (also zb Folder)
Ja, und da sollten doch die benötigten Informationen zu finden sein?
Was hast du genau vor?
Ich möchte das parent element des aktuell markierten TreeViewItems haben
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.
Aus welchem Grund willst du jetzt dem ViewModel Zugriff auf die View geben?
Also eigentlich wollte ich nur das parent property des treeviewitem an ein property des viewmodel binden
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?
Anders gesagt/gefragt:
Du möchtest zum ausgewählten Ordner/Snippet den übergeordneten Ordner haben?
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