WPF डेटाबाइंडिंग: मैं "पैरेंट" डेटा संदर्भ का उपयोग कैसे करूँ?


215

मेरे पास एक सूची है (नीचे देखें) एक विंडो में निहित है। खिड़की के DataContextदो गुण हैं, Itemsऔर AllowItemCommand

मैं के लिए बाध्यकारी कैसे मिलता है Hyperlinkकी 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

सरल समाधान (जो विंडोज 8 स्टोर / मेट्रो ऐप में भी काम करता है) यहां है: 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 पर सेट एक संदर्भ से अपने वीएम पर एक ICommand को बांधने के लिए इसका इस्तेमाल किया। बढ़िया काम किया, धन्यवाद !!
विल पी।

1
विंडोज 8 ऐप में कोई ऐसा कैसे करता है? मैंने इसे काम में लाने के लिए "ElementName = ..." का उपयोग किया, लेकिन यह DataContext को लीक करता है
Joris Weimar

3
लीक से क्या मतलब है?
फ्लेक

अफसोस की बात है कि मेरे लिए काम नहीं किया क्योंकि माता-पिता एक अलग फाइल में हैं।
थॉमस

@ थॉमस ६ your६ your, आशा है कि आपने अपना मुद्दा हल कर लिया है, कृपया अपने कोड को लिख सकते हैं।
मोहम्मद अबरार अहमद

37

यह भी काम करेगा:

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

ListViewइसके प्राप्त कर लेगा DataContextसे Window, भी तो यह इस बिंदु पर उपलब्ध है।
और चूंकि ListView, इसी तरह के नियंत्रण (जैसे Gridview, ListBoxआदि) की तरह, एक उपवर्ग है ItemsControl, Bindingऐसे नियंत्रणों के लिए पूरी तरह से काम करेगा।


15
(पोस्टर और संपादक को देखते हुए) मुझे यह पोस्ट मजेदार लगी ...: D
जैक फ्रॉस्ट

@ जेकफ्रॉस्ट अगर योदा क्योल के साथ फिर से काम करता है। कियो योडा को मारने वाला है। : P
Kylo Ren

नहीं, वह नहीं कर सकता। योदा अब बल के साथ एक है। हेहे
जैक फ्रॉस्ट

10

यह सिल्वरलाइट 5 में भी काम करता है (शायद पहले भी लेकिन मैंने इसका परीक्षण नहीं किया है)। मैं इस तरह रिश्तेदार स्रोत का इस्तेमाल किया और यह ठीक काम किया।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.