FindAncestor funktioniert irgendwie nicht, kann es mir nicht erklären

  • WPF

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    FindAncestor funktioniert irgendwie nicht, kann es mir nicht erklären

    Hallo Liebe Community,

    ich habe ein MainViewModel, und eine MainView, auf der MainView Ist ein UCL (DroplistBox) in dieser Listbox, sind Items geladen. Ich möchte erreichen, das, wenn ich auf eines dieser ListViewItems rechtsklicke, ein ContextMenü aufgeht, da hab ich einen Button Delete drinne. ContextMenu geht natürlich auch schon ^^

    Und das entsprechende DeleteCommand ist im MainViewModel hinterlegt. Ich bekomme es ums verrecken nicht hin, eine Bindung von diesem ListBoxItem auf das im MainViewModel befindliche Command zu erstellen


    Aufbau:
    MainViewModel, enthält eine ObservableCollection (of ServiceReportViewModel)
    MainViewModel, enthält ebenfalls das DeleteCommand welches im Endeffekt nur das aktuell selektierte Item aus der Observable Collection löschen soll

    Im MainView ist ein Control mit Namen: DropListBox, dieses stellt im Endeffekt nur eine Listbox mit einer Dropfunktionalität dar.
    In die ListBox werden ServiceReportViewModels geladen, diese werden über ein DataTemplate, als ServiceReportView angezeigt.
    Dem ServiceReportViewModel ist in der Application.xaml, per DataTemplate, die ServiceReportView (UCL) zugewiesen.

    Auf dem ServiceReportView, ist ein ContextMenu zugewiesen, dieses enthält den Befehl Delete. Wenn ich auf diesen klicke, möchte ich das DeleteCommand, welches im MainViewModel steckt ausführen, leider krieg ich das aktuell nicht hin, hat jemand evtl. eine Idee ?


    LG AsusDK
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hallo

    asusdk schrieb:

    Ich möchte erreichen, das, wenn ich auf eines dieser ListViewItems rechtsklicke, ein ContextMenü aufgeht, da hab ich einen Button Delete drinne.


    Wo befindet sich das Contextmenü. Also wo ist das gebunden.
    Sollte sich eben im selben ViewModel wie die Auflistung befinden und sich auf das selectedItem der Auflistung beziehen. Dann hast du hier keinerlei probleme. da du ja auf das Item innerhalb des ViewModel bindest und nicht auf Controls.

    Grüße
    Sascha

    Edit: FindAncestor funktioniert bei einem ContextMenü nicht weil es sich nicht im ElementTree befindet somit kann keine Bindung zu Controls hergestellt werden.
    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. ##

    Ah ok, dann versuch ich es mal mit einem InputBinding


    Das ContextMenu war bisher in Dem ServiceReportView, welche allerdings auf ein anderes ViewModel bindet, als dasjenige in welchem das Command liegt, das Command befindet sich im MainViewModel


    Nachtrag: @Nofear23m Danke für deinen Tipp ! Mit einem InputBinding anstelle des Contextmenus funktioniert es wie gewünscht

    XML-Quellcode

    1. ​<UserControl.InputBindings>
    2. <MouseBinding Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.DeleteSelectedSRItemCommand}"
    3. MouseAction="RightClick"/>
    4. </UserControl.InputBindings>
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „asusdk“ ()

    Ich hab hier eine Lösung - allerdings weiss ich nicht mehr ganz genau, wie sie funktioniert:

    XML-Quellcode

    1. <TreeView x:Name="tv" hlp:GridEx.Range="1" ItemsSource="{Binding Nodes}" hlp:VisualSubscribe.Subscribe="{Binding _TvSubscribe}" >
    2. <ItemsControl.ItemTemplate>
    3. <HierarchicalDataTemplate ItemsSource="{Binding}" >
    4. <Border x:Name="brd" BorderBrush="{Binding MappingState, Converter={StaticResource brshConnected}, Mode=OneWay}" BorderThickness="6,0,0,0" Padding="1,0,0,0" >
    5. <FrameworkElement.ContextMenu>
    6. <ContextMenu hlp:SelectOnOpen.AttachedValue="true" ItemsSource="{Binding MenuItems}">
    7. <ItemsControl.ItemContainerStyle>
    8. <Style TargetType="MenuItem">
    9. <Style.Setters>
    10. <Setter Property="Header" Value="{Binding Name}"/>
    11. <Setter Property="Command" Value="{Binding Command}"/>
    12. <Setter Property="CommandParameter" Value="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/>
    13. </Style.Setters>
    14. </Style>
    15. </ItemsControl.ItemContainerStyle>
    16. </ContextMenu>
    17. </FrameworkElement.ContextMenu>
    18. <TextBlock Text="{Binding Name}"/>
    19. <Border.RenderTransform>
    20. <TranslateTransform X="-4"/>
    21. </Border.RenderTransform>
    22. </Border>
    23. </HierarchicalDataTemplate>
    24. </ItemsControl.ItemTemplate>
    25. </TreeView>

    Der Witz ist glaub, dass im ItemContainerStyle iwas ans ContextMenu gebunden ist.
    Ah - der DataContext vom PlacementTarget vom ContextMenü. Ja, und das ist glaub das item, auf welches sich das ContextMenü bezieht. Glaub ich.
    Nee - aber so ähnlich. Halt Wpf: Mal super-einfach, mal sowas von hinten durch die Brust und dann doch lieber ins Hühnerauge.