WPF Databinding: ฉันจะเข้าถึงบริบทข้อมูล "พาเรนต์" ได้อย่างไร?


216

ฉันมีรายการ (ดูด้านล่าง) ที่มีอยู่ในหน้าต่าง หน้าต่างDataContextมีสองคุณสมบัติและItemsAllowItemCommand

ฉันจะได้รับผลผูกพันสำหรับHyperlink's Commandความต้องการคุณสมบัติการแก้ปัญหากับหน้าต่างของ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 ได้หรือไม่? ถ้าเป็นเช่นนั้นคุณสามารถเข้าไปในตัวแปรและพยายามที่จะเจาะ
ist_lion

วิธีแก้ปัญหาง่าย ๆ (ซึ่งยังใช้งานได้ในแอพ Windows 8 Store / Metro) อยู่ที่นี่: http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382
LMK

คำตอบ:


418

คุณสามารถลองสิ่งนี้:

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

2
ฉันใช้สิ่งนี้เพื่อผูกกับ ICommand บน VM ของฉันจาก ContextMenu ที่ตั้งอยู่ใน ListBoxItem จากภายในสไตล์ ใช้งานได้ดีขอบคุณ !!
Wil P

1
มีวิธีการอย่างไรในแอพ Windows 8 ฉันใช้ "ElementName = ... " เพื่อให้มันทำงานได้ แต่มันรั่ว DataContext
Joris Weimar

3
คุณหมายถึงอะไรรั่ว?
flq

น่าเศร้าที่ใช้ไม่ได้กับฉันเพราะพ่อแม่อยู่ในไฟล์ที่แตกต่าง
โทมัส

@ Thomas6767 หวังว่าคุณจะสามารถแก้ไขปัญหาของคุณได้โปรดรหัสของคุณ
Mohammed Abrar Ahmed

38

สิ่งนี้จะได้ผล:

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

ListViewจะสืบทอดDataContextมาจากWindowดังนั้นจึงมีให้ ณ จุดนี้เช่นกัน
และเนื่องจากListView, เช่นเดียวกับการควบคุมที่คล้ายกัน (เช่นGridview, ListBoxฯลฯ ), เป็นคลาสย่อยของItemsControl, Bindingสำหรับการควบคุมดังกล่าวจะทำงานได้อย่างสมบูรณ์แบบ


15
(ดูโปสเตอร์และบรรณาธิการ) ฉันพบว่าโพสต์นี้ตลก ... : D
Jack Frost

@JackFrost หาก Yoda รบกวนการทำงานของ Kylo'l อีกครั้ง Kylo กำลังจะฆ่า Yoda : P
Kylo Ren

ไม่เขาไม่สามารถ โยดาเป็นหนึ่งในพลังตอนนี้ Hehehe
Jack Frost

10

สิ่งนี้สามารถใช้งานได้ใน Silverlight 5 (อาจเร็วกว่านี้ แต่ฉันยังไม่ได้ทดสอบ) ฉันใช้แหล่งที่มาแบบสัมพัทธ์เช่นนี้

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.