Probleme beim Binding von Child Elements

  • WPF

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    Probleme beim Binding von Child Elements

    Hallo,
    ich habe ein Problem mit dem Binding in einem UserControl. Hier ist das UC:
    Spoiler anzeigen

    C#-Quellcode

    1. public partial class Preview3D : UserControl
    2. {
    3. public Preview3D()
    4. {
    5. InitializeComponent();
    6. SetValue(ItemsProperty, new FreezableCollection<FrameworkElement>());
    7. Items.Changed += Items_Changed;
    8. }
    9. public FreezableCollection<FrameworkElement> Items
    10. {
    11. get { return (FreezableCollection<FrameworkElement>)GetValue(ItemsProperty); }
    12. set { SetValue(ItemsProperty, value); }
    13. }
    14. public static readonly DependencyProperty ItemsProperty =
    15. DependencyProperty.Register("Items", typeof(FreezableCollection<FrameworkElement>), typeof(Preview3D), new PropertyMetadata(null));
    16. private void Items_Changed(object sender, EventArgs e)
    17. {
    18. if(Items == null)
    19. {
    20. ClearModels();
    21. return;
    22. }
    23. foreach(var itm in Items)
    24. {
    25. itm.DataContext = DataContext;
    26. IModelBase itmB = (IModelBase)itm;
    27. if (!modelGroup.Children.Any((i) => i == itmB.Model))
    28. AddModel(itmB);
    29. }
    30. for(int i = modelGroup.Children.Count - 1; i >= 0; --i)
    31. {
    32. var itm = modelGroup.Children[i];
    33. if (!Items.Any((it) => ((IModelBase)it).Model == itm))
    34. RemoveModel(itm);
    35. }
    36. }
    37. ...
    38. }

    Preview3D zeigt mehrere 3D Modelle (Items-Property) an, darin lässt sich rotieren, zoomen etc. Funktioniert auch wunderbar.
    Das XAML des Windows sieht so aus:

    XML-Quellcode

    1. <pv:Preview3D>
    2. <pv:Preview3D.Items>
    3. <pv:RobotModel AxisPulse="{Binding ElementName=sliderS, Path=Value}"/>
    4. </pv:Preview3D.Items>
    5. </pv:Preview3D>
    6. <StackPanel Grid.Column="1">
    7. <Slider x:Name="sliderS" Minimum="-100" Maximum="100" Margin="10"/>
    8. </StackPanel>

    Dadurch, dass ich den DataContext manuell im ItemsChanged zuweise kann ich schonmal korrekt daran binden. Nur sobald ich per ElementName oder Ähnlichem binde klappt's nicht mehr. Wenn ich mir beim Debugging die Parent-Property des Items angucke ist diese null. Muss/kann ich der WPF irgendwie mitteilen, dass alle Items zum ElementTree gehören? Eigentlich wird der DataContext ja auch automatisch weitergereicht.
    Hat jemand da vielleicht ne Idee?

    Grüße
    Hallo

    Sowas ist leider recht schwer nachzustellen bzw. verstehe ich nicht ganz warum du den Datenkontext per Code zuweist.
    Hast du die möglichkeit eine kleine Demo zu erstellen die das problem reproduziert, dann tun wir uns leichter.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ich hab das Problem mittlerweile erkannt. Dadurch dass die Items nicht zum Visual- oder LogicalTree gehören, wird der DataContext nicht weitervererbt. Wenn man sich mal die Sources von Viewport3D in der ReferenceSource anguckt, rufen die für jedes Child DependencyObject.ProvideSelfAsInheritanceContext() auf. Leider hat MS die Methode als internal gekennzeichnet :|

    @Nofear23m
    Konntest du schon eine Lösung finden?
    Hallo @Gonger96

    Sorry das ich mich nicht gemeldet habe. Ich bin im Moment sowohl in der Arbeit als auch ausserhalb so eingespannt das ich nicht mal weis wo mir der Kopf steht.
    Ja, ich habe mir das Beispiel schon angesehen und habe gesehen das die Elemente (Der genaue Typ ist mir jetzt entfallen) von keinem Typ erben welcher zum Visualtree gehören und somit den DataContext erben.

    Um eine Lösung konnte ich mich noch nicht bemühen, werde ich aber die Tage versuchen.
    Da ich in der Autobranche arbeite kannst du dir vorstellen was da im Moment los ist. <X

    Ich werde unbedingt versuchen die nächsten Tage eine Lösung zu finden denn das interessiert mich mittlerweile auch. *gg*

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##