2011-09-29 13 views
7

Próbuję powiązać polecenie MenuItem z poleceniem zawartym w UserControl.DataContext. Znalazłem kilka podobnych pytanie, ale rozwiązanie według nich nie udaje się mnie:Bind to parent DataContext w DataTemplate

<UserControl ...> 
<UserControl.Resources> 
    <DataTemplate x:Key="TileItemStye"> 
     <Grid Width="100" Height="100"> 
      <Grid.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="Remove" 
           Command="{Binding DataContext.RemoveItem, 
           RelativeSource={RelativeSource FindAncestor, 
              AncestorType=UserControl}}"> 
        </MenuItem> 
       </ContextMenu> 
      </Grid.ContextMenu> 
     </Grid> 
    </DataTemplate> 
</UserControl.Resources> 
<Grid> 
    <ListView ItemsSource="{Binding Path=Files}" 
       ItemTemplate="{DynamicResource TileItemStye}" > 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 
</Grid> 

UserControl za DataContext jest ViewModel z ICommand removeItem i ObservableCollection<FileViewModel> Files.

+0

co oznacza "nieprzestrzeganie" Ciebie? - Proszę wyjaśnij błąd, który otrzymujesz ... – Carsten

+0

Polecenie nie jest związane ... Nie dostaję żadnego błędu, tylko handler, który jest zobowiązany do polecenia, nigdy nie jest nazywany – bkovacic

+1

Myślę, że Datacontext powinien po prostu "padać" na twoje szablon, czy wypróbowałeś Command = "{Binding Path = RemoveItem}"? – hyp

Odpowiedz

13

Jeśli jesteś na .NET 4 tam rzeczywiście jest bardziej eleganckie rozwiązanie:

<UserControl Name="uc" ...> 
<!-- ... --> 
    <MenuItem Header="Remove" 
       Command="{Binding DataContext.RemoveItem, 
           Source={x:Reference uc}}"/> 

(wymaga th na szablonie pozostaje w Zasobach, w przeciwnym razie wystąpi cykliczny błąd zależności).

+0

Czy możesz rozwinąć błąd zależności? Mam podobną sytuację, w której używam ElementName = LayoutRoot, aby dostać się do DataContext (mój ViewModel). ale przecieka model podglądu. Czy byłby to błąd cykliczności depency, o którym mówisz? jakikolwiek sposób rozwiązać ten problem? (Windows store app btw) –

+0

@JorisWeimar: Błędy zależności występują tylko dla 'x: Reference' w przypadku, gdy odwołujesz się do kontrolki z jej drzewa, np. jeśli 'Grid' zawiera' TextBlock' i próbujesz odwołać się do 'Grid' w powiązaniu na' TextBlock', które spowodowałoby taki błąd. Używam tylko 'x: Reference' tutaj, ponieważ' ElementName' nie działa w kontekście odłączonych drzew. Co do twojego problemu, nie rozumiem, co ma znaczyć "wyciek modelu widoku". –

+0

z przeciekiem w viewmodelu mam na myśli to, że viewmodel nie jest sfinalizowany, ponieważ istnieje gdzieś z niego gdzieś z warstwy COM (co zebrałem z PerfView). wydaje się prawie, że jest to nieodłączny problem z tego typu konstrukcją. –

4

dietetyczne nie są sporządzone w tym samym drzewie widocznością, formantów, dlatego wiązanie RelativeSource nie działa

trzeba wiązać się z PlacementTarget swojej ContextMenu dostęp do głównego wizualne drzewa

<MenuItem Header="Remove" 
      Command="{Binding PlacementTarget.DataContext.RemoveItem, 
       RelativeSource={RelativeSource FindAncestor, 
       AncestorType={x:Type ContextMenu}}}" /> 
+0

Hm ... Nadal nie jestem w stanie wywołać polecenia. Rozumiem, o co ci chodzi, ale wiązanie nie działa. – bkovacic

+0

@Pedala Mogłem mieć błędną składnię. Wiem, że chcesz powiązać z 'PlacementTarget', który powinien zwrócić Kontrolę, do której jest przyłączone' ContextMenu', ale możesz potrzebować użyć innej składni, aby przejść do Polecenia – Rachel

+0

Wiązanie, które napisałeś, przechodzi do Grid (ten wewnątrz DataTemplate), ale nie aż do DataContext UserControl (gdzie polecenie jest). Pytanie, czy można zagnieżdżać wiązania, więc mogę wyjść z tej siatki? – bkovacic

Powiązane problemy