2009-10-02 11 views
21

Mam ItemControl, którego dla ItemTemplate DataTemplate zawiera przycisk. Chcę, aby polecenie na przycisku powiązało polecenie z DataContext elementu ItemsControl, a nie ItemTemplate. Myślę, że rozwiązanie ma do czynienia z użyciem RelativeSource, ale moje próby do tej pory nie udało:Bind to ItemsControl DataContext z wewnątrz ItemTemplate

<ItemsControl ItemsSource="{Binding Games}">   
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Button Command="{Binding Path=GameSelectedCommand, Source={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" 
        CommandParameter="{Binding}" 
        Style="{StaticResource MenuButtonStyle}" 
        Content="{Binding Name}"/>  
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Jak mogę uzyskać przycisk do wiązania się z GameSelectedCommand obiektu ItemsControl za DataContext?

Odpowiedz

40

Ustawiasz źródło powiązania z samym ItemsControl. Dlatego trzeba dereference DataContext z ItemsControl:

Command="{Binding DataContext.GameSelectedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" 

Jak byś wiedział o tym? Podczas uruchamiania aplikacji spójrz na okno wyjściowe debugowania. Zobaczysz komunikat o następującej treści: "Nie można rozwiązać właściwości" GameSelectedCommand "na typ" ItemsControl "".

+1

dziękuję za odpowiedź, ale tak naprawdę to wypróbowałem. Otrzymałem następujący błąd DataBinding: System.Windows.Data Error: 39: Błąd ścieżki BindingExpression: Właściwość "DataContext" nie została znaleziona w 'obiekcie' '' RelativeSource '(HashCode = 50668565) ". BindingExpression: Path = DataContext.GameSelectedCommand; DataItem = 'RelativeSource' (HashCode = 50668565); elementem docelowym jest "Button" (Name = ''); Właściwością target jest "Command" (typ "ICommand"). Nie jestem pewien, czy faktycznie znajduje ItemsControl w sobie –

+3

Ha! Niestety, przegapiłem fakt, że zamiast Source = "..." masz Source = "...". Zobacz moją zaktualizowaną odpowiedź. –

+0

to wszystko, dziękuję. –