2009-10-02 23 views
21

Tôi có một ItemsControl có ItemTemplate DataTemplate chứa một Button. Tôi muốn lệnh trên nút để liên kết với một lệnh trên DataContext của ItemsControl, không phải là ItemTemplate. Tôi nghĩ rằng giải pháp đã làm với sử dụng RelativeSource, nhưng những nỗ lực của tôi cho đến nay đã thất bại:Liên kết với các mụcControl DataContext từ bên trong một 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> 

Làm thế nào tôi có thể nhận được các nút để ràng buộc vào GameSelectedCommand của đối tượng ItemsControl của DataContext?

Trả lời

40

Bạn đang đặt nguồn liên kết với chính số ItemsControl. Vì vậy, bạn sẽ cần phải dereference các DataContext của ItemsControl:

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

Làm thế nào bạn đã biết điều này? Hãy xem cửa sổ đầu ra gỡ lỗi của bạn khi chạy ứng dụng. Bạn sẽ thấy một thông báo dọc theo dòng "Không thể giải quyết thuộc tính 'GameSelectedCommand' trên loại 'ItemsControl'".

+1

cảm ơn câu trả lời, nhưng tôi thực sự đã thử điều này. Tôi nhận được lỗi DataBinding sau đây: Lỗi System.Windows.Data: 39: Lỗi đường dẫn BindingExpression: thuộc tính 'DataContext' không tìm thấy trên 'đối tượng' '' RelativeSource '(HashCode = 50668565)'. BindingExpression: Đường dẫn = DataContext.GameSelectedCommand; DataItem = 'RelativeSource' (HashCode = 50668565); yếu tố đích là 'Nút' (Tên = ''); mục tiêu bất động sản là 'Command' (loại 'ICommand') Tôi không chắc chắn nó thực sự tìm kiếm các ItemsControl chính nó –

+3

Ha! Xin lỗi, tôi đã bỏ lỡ thực tế là bạn đã có Source = "..." thay vì RelativeSource = "...". Xem câu trả lời cập nhật của tôi. –

+0

là vậy, cảm ơn. –

Các vấn đề liên quan