CollectionContainer - Neue Items finden RelativeSource nicht

  • WPF

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von VincentTB.

    CollectionContainer - Neue Items finden RelativeSource nicht

    Hi,
    ich habe ein elendes Problem mit dem CollectionContainer. Mein Ziel ist, dass ich oben statische Menuitems habe und unten welche aus einer Liste, die einen Command aufrufen. Mein XAML-Code sieht so aus:

    XML-Quellcode

    1. <ListView> [...] <ContextMenu> [...]
    2. <MenuItem Header="{DynamicResource AddToPlaylist}">
    3. <MenuItem.Resources>
    4. <CollectionViewSource Source="{Binding RelativeSource={RelativeSource AncestorType=ListView},Path=DataContext.MusicManager.Playlists}" x:Key="MyMenuItems"/>
    5. </MenuItem.Resources>
    6. <MenuItem.ItemsSource>
    7. <CompositeCollection>
    8. <MenuItem Header="{DynamicResource NewPlaylist}"/>
    9. <Separator />
    10. <CollectionContainer Collection="{Binding Source={StaticResource MyMenuItems}}"/>
    11. </CompositeCollection>
    12. </MenuItem.ItemsSource>
    13. <MenuItem.ItemContainerStyle>
    14. <Style TargetType="MenuItem" BasedOn="{StaticResource MetroMenuItem}">
    15. <Setter Property="Command" Value="{Binding RelativeSource={RelativeSource AncestorType=ListView},Path=DataContext.TrackSearcher.AddToPlaylist}"/>
    16. <Setter Property="CommandParameter" Value="{Binding}"/>
    17. <Setter Property="HorizontalContentAlignment" Value="Left"/>
    18. <Setter Property="VerticalContentAlignment" Value="Center"/>
    19. </Style>
    20. </MenuItem.ItemContainerStyle>
    21. </MenuItem>


    Bei bereits vorhanden Items funktioniert das wunderbar, das heißt, der Command wird aufgerufen. Neue Items können jedoch gar nicht erst an den DataContext binden - der Command wird nicht aufgerufen und es gibt eine Bindings-Fehlermeldung:

    Quellcode

    1. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ListView', AncestorLevel='1''. BindingExpression:Path=DataContext.TrackSearcher.AddToPlaylist; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'Command' (type 'ICommand')


    Auch wenn ich eins höher gehe (also das Window suche) funktioniert es nicht. Bin echt am Verzweifeln, diese blöden Collections außerhalb des Visual Trees :(
    Mfg
    Vincent

    VincentTB schrieb:

    Bin echt am Verzweifeln, diese blöden Collections außerhalb des Visual Trees
    Ist das ein Menu oder ein ContextMenu?
    Weil meines Wissens sind nur MenuItems eines ContextMenus ausserhalb.
    ah ja, jetzt sehe ich: tatsächlich ContextMenu.
    Da kann man tricksen, indem man an den DataContext des PlacementTargets bindet oder sowas.
    Habich in meim Sync-Projekt (s.SCA) gemacht:

    XML-Quellcode

    1. <ContextMenu hlp:SelectOnOpen.AttachedValue="true" ItemsSource="{Binding MenuItems}">
    2. <ItemsControl.ItemContainerStyle>
    3. <Style TargetType="MenuItem">
    4. <Style.Setters>
    5. <Setter Property="Header" Value="{Binding Name}"/>
    6. <Setter Property="Command" Value="{Binding Command}"/>
    7. <Setter Property="CommandParameter" Value="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/>
    8. </Style.Setters>
    9. </Style>
    10. </ItemsControl.ItemContainerStyle>
    11. </ContextMenu>