WPF 데이터 바인딩 :“부모”데이터 컨텍스트에 어떻게 액세스합니까?


215

창에 포함 된 목록 (아래 참조)이 있습니다. 윈도우의이 DataContext두 가지 속성을 가지고 ItemsAllowItemCommand.

HyperlinkCommand속성에 대한 바인딩을 창에 대해 해결 하려면 어떻게해야 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>

디버거에 들어가서 UI가 구축되는 시점까지 단계적으로 진행할 수 있습니까? 그렇다면 변수에
들어가서

간단한 솔루션 (Windows 8 Store / Metro 앱에서도 작동)은 다음과 같습니다. http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382
LMK

답변:


417

다음과 같이 시도해보십시오.

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

2
스타일 내에서 ListBoxItem에 설정된 ContextMenu에서 내 VM의 ICommand에 바인딩하는 데 사용했습니다. 고마워요 !!
Wil P

1
Windows 8 앱에서이 작업을 어떻게 수행합니까? "ElementName = ..."을 사용하여 작동 시켰지만 DataContext가 누출되었습니다.
Joris Weimar

3
누출이란 무엇입니까?
flq

부모가 다른 파일에 있기 때문에 슬프게도 나를 위해 일하지 않았습니다.
토마스

@ Thomas6767, 문제를 해결하여 코드를 기쁘게 할 수 있기를 바랍니다.
Mohammed Abrar Ahmed

37

이것은 또한 작동합니다 :

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

ListViewDataContext에서 from 을 상속하므로이 Window시점에서도 사용할 수 있습니다.
그리고 이후 ListView, 단지 유사한 컨트롤 (예처럼 Gridview, ListBox등)의 서브 클래스 ItemsControlBinding이러한 컨트롤은 완벽하게 작동합니다.


15
(포스터와 에디터를 보면)이 포스트가 재미 있다는 것을 알았습니다 ... : D
Jack Frost

Yoda가 Kylo'l 작업을 다시 방해하면 @JackFrost입니다. Kylo는 Yoda를 죽일 것입니다. : P
Kylo Ren

아니, 그는 못해 요다는 지금 힘을 가진 사람입니다. Hehehe
잭 프로스트

10

이것은 Silverlight 5에서도 작동합니다 (아마도 초기에는 테스트하지는 않았습니다). 나는 이와 같은 상대 소스를 사용했고 잘 작동했다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.