2009-07-14 4 views
165

Tôi có một danh sách (xem bên dưới) có trong cửa sổ. Cửa sổ DataContext có hai thuộc tính, ItemsAllowItemCommand.WPF Databinding: Làm thế nào để truy cập bối cảnh dữ liệu "cha mẹ"?

Làm cách nào để nhận được ràng buộc cho thuộc tính'Command cần phải giải quyết chống lại cửa sổ DataContext?

<ListView ItemsSource="{Binding Items}"> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn Header="Action"> 
     <GridViewColumn.CellTemplate> 
      <DataTemplate> 
      <StackPanel> 
       <TextBlock> 

       <!-- this binding is not working --> 
       <Hyperlink Command="{Binding AllowItemCommand}" 
          CommandParameter="{Binding .}"> 
        <TextBlock Text="Allow" /> 
       </Hyperlink> 

       </TextBlock> 
      </StackPanel> 
      </DataTemplate> 
     </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
    </GridView> 
    </ListView.View> 
</ListView> 
+0

Bạn có thể truy cập trình gỡ rối và chuyển đến điểm giao diện người dùng đang được xây dựng không? Nếu vậy bạn có thể vào được biến và cố gắng khoan lên –

+0

Giải pháp đơn giản (cũng hoạt động trong ứng dụng Windows 8 Store/Metro) ở đây: [http://stackoverflow.com/questions/15366609/how-to-access- parent-datacontext-in-window-8-store-apps/15419382 # 15419382] (http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382) – LMK

Trả lời

331

Bạn có thể thử một cái gì đó như thế này:

...Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" ... 
+2

Tôi đã sử dụng điều này để liên kết với một ICommand trên máy ảo của tôi từ một ContextMenu được thiết lập trên một ListBoxItem từ bên trong một Style. Làm việc tuyệt vời, cảm ơn !! –

+1

Làm cách nào để thực hiện điều này trong ứng dụng Windows 8? Tôi đã sử dụng "ElementName = ..." để làm cho nó hoạt động, nhưng nó làm rò rỉ DataContext –

+3

Bạn có ý gì khi bị rò rỉ? – flq

6

này cũng hoạt động trong Silverlight 5 (có lẽ trước đó cũng nhưng tôi đã không kiểm tra nó). Tôi đã sử dụng nguồn tương đối như thế này và nó hoạt động tốt.

RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=telerik:RadGridView}"

+0

Tại sao nó không phải là một ý tưởng tốt? – rolls

17

này cũng sẽ làm việc:

<Hyperlink Command="{Binding RelativeSource={RelativeSource AncestorType=ItemsControl}, 
          Path=DataContext.AllowItemCommand}" /> 

ListView sẽ kế thừa của nó DataContext từ Window, vì vậy nó có sẵn tại thời điểm này, quá.
Và kể từ ListView, giống như các điều khiển tương tự (e. G. Gridview, ListBox, v.v.), là một phân lớp của ItemsControl, các Binding cho các điều khiển đó sẽ hoạt động hoàn hảo.