WPF Databinding: Làm thế nào để tôi truy cập vào bối cảnh dữ liệu của cha mẹ mẹ?


215

Tôi có một danh sách (xem bên dưới) có trong một cửa sổ. Cửa sổ DataContextcó hai thuộc tính ItemsAllowItemCommand.

Làm thế nào để có được các ràng buộc cho Hyperlink's Commandnhu cầu tài sản để quyết tâm chống lại các cửa sổ của 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>

Bạn có thể vào trình gỡ lỗi và bước qua điểm mà UI đang được xây dựng không? Nếu vậy bạn có thể vào biến và cố gắng tìm hiểu thêm
ist_lion

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

Câu trả lời:


417

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 mình từ một ContextMothy được đặt trên ListBoxItem từ trong Kiểu. Làm việc tuyệt vời, cảm ơn !!
Wil P

1
Làm thế nào để một người làm điều này trong một ứng dụng Windows 8? Tôi đã sử dụng "ElementName = ..." để làm cho nó hoạt động, nhưng nó rò rỉ DataContext
Joris Weimar

3
Bạn có ý nghĩa gì bởi rò rỉ?
flq

Đáng buồn thay đã không làm việc cho tôi vì cha mẹ ở trong một tập tin khác.
Thomas

@ Thomas6767, Hy vọng bạn đã giải quyết được vấn đề của mình, xin vui lòng mã của bạn.
Mohammed Abrar Ahmed

37

Điều này cũng sẽ làm việc:

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

ListViewsẽ kế thừa DataContexttừ đó Window, vì vậy nó cũng có sẵn tại thời điểm này.
Và vì ListView, giống như các điều khiển tương tự (ví dụ Gridview, ListBoxv.v.), là một lớp con của ItemsControl, các Bindingđiều khiển như vậy sẽ hoạt động hoàn hảo.


15
(Nhìn vào poster và biên tập viên) Tôi thấy bài đăng này thật hài hước ...: D
Jack Frost

@JackFrost nếu Yoda can thiệp vào Kylo'l hoạt động trở lại. Kylo sẽ giết Yoda. : P
Kylo Ren

Không, anh không thể. Yoda là một với lực lượng bây giờ. Hehehe
Jack Frost

10

Điều này cũng hoạt động trong Silverlight 5 (có lẽ sớm hơn nhưng tôi chưa thử nó). Tôi đã sử dụng các nguồn tương đối như thế này và nó hoạt động tốt.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.