2011-09-29 19 views
7

के भीतर पैरेंट डेटा कॉन्टेक्स्ट से जुड़ें मैं UserControl.DataContext में निहित कमांड के लिए मेनूइटम के कमांड को बांधने की कोशिश कर रहा हूं। समान प्रश्न का मैंने पाया जोड़ी है, लेकिन समाधान उनके अनुसार मेरे लिए विफल हो रहा है:डेटा टेम्पलेट

<UserControl ...> 
<UserControl.Resources> 
    <DataTemplate x:Key="TileItemStye"> 
     <Grid Width="100" Height="100"> 
      <Grid.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="Remove" 
           Command="{Binding DataContext.RemoveItem, 
           RelativeSource={RelativeSource FindAncestor, 
              AncestorType=UserControl}}"> 
        </MenuItem> 
       </ContextMenu> 
      </Grid.ContextMenu> 
     </Grid> 
    </DataTemplate> 
</UserControl.Resources> 
<Grid> 
    <ListView ItemsSource="{Binding Path=Files}" 
       ItemTemplate="{DynamicResource TileItemStye}" > 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 
</Grid> 

UserControl के DataContext ICommand RemoveItem और ObservableCollection<FileViewModel> फ़ाइलें साथ ViewModel है।

+0

आपको "विफल" क्या है? - कृपया जो त्रुटि आपको मिलती है उसे समझाएं .... – Carsten

+0

कमांड बाध्य नहीं है ... मुझे कोई त्रुटि नहीं मिलती है, केवल कमांडर जो आदेश के लिए बाध्य है उसे कभी भी – bkovacic

+1

नहीं कहा जाता है, मुझे लगता है कि डेटाकॉन्टेक्स्ट को बस "बारिश" करनी चाहिए टेम्पलेट, क्या आपने कमांड = "{बाइंडिंग पथ = RemoveItem}" कोशिश की? – hyp

उत्तर

13

आप .NET 4 वहाँ पर हैं, तो वास्तव में एक और अधिक सुरुचिपूर्ण समाधान है:

<UserControl Name="uc" ...> 
<!-- ... --> 
    <MenuItem Header="Remove" 
       Command="{Binding DataContext.RemoveItem, 
           Source={x:Reference uc}}"/> 

(यह वीं की आवश्यकता है टेम्पलेट में संसाधनों में रहता है, अन्यथा चक्रीय निर्भरता त्रुटि होगी)

+0

क्या आप निर्भरता त्रुटि पर विस्तार कर सकते हैं? मेरे पास एक समान स्थिति है जहां मैं DataContext (my ViewModel) पर जाने के लिए ElementName = LayoutRoot का उपयोग कर रहा हूं। लेकिन यह व्यूमोडेल लीक कर रहा है। क्या यह चक्रीय निर्भरता त्रुटि होगी जिसके बारे में आप बात कर रहे हैं? इसे हल करने का कोई तरीका? (विंडोज स्टोर ऐप बीटीडब्ल्यू) –

+0

@ जोरीस वेइमर: निर्भरता त्रुटियां केवल 'x: संदर्भ' के लिए होती हैं यदि आप अपने पेड़ के भीतर से नियंत्रण का संदर्भ देते हैं, उदा। यदि 'ग्रिड' में 'टेक्स्टब्लॉक' है और आप' टेक्स्टब्लॉक 'पर बाध्यकारी में' ग्रिड 'को संदर्भित करने का प्रयास करते हैं जो ऐसी त्रुटि उत्पन्न करेगा। मैं केवल 'x: संदर्भ' का उपयोग करता हूं क्योंकि' ElementName' डिस्कनेक्ट किए गए पेड़ों के संदर्भ में काम नहीं करता है। आपकी समस्या के बारे में, मुझे समझ में नहीं आता कि "व्यूमोडेल लीक करना" का क्या अर्थ है। व्यूमोडेल को लीक करने के साथ –

+0

मेरा मतलब है कि व्यूमोडेल को अंतिम रूप दिया नहीं गया है क्योंकि वहां COM परत के भीतर से कहीं भी इसकी आवश्यकता है (जिसे मैंने पेर्फ व्यू से एकत्र किया है)। यह लगभग लगता है कि यह इस प्रकार के निर्माण के साथ एक अंतर्निहित समस्या है। –

4

मेनू है जो आपके नियंत्रण के रूप में ही दृश्य ट्री, में तैयार नहीं कर रहे हैं क्यों RelativeSource बाध्यकारी

काम नहीं करता है आप मुख्य दृश्य ट्री

<MenuItem Header="Remove" 
      Command="{Binding PlacementTarget.DataContext.RemoveItem, 
       RelativeSource={RelativeSource FindAncestor, 
       AncestorType={x:Type ContextMenu}}}" /> 
पहुंचने के लिए अपने ContextMenu की PlacementTarget करने के लिए बाध्य करने की जरूरत है
+0

एचएम की मदद नहीं कर रहा है ... मैं अभी भी एक कमांड कॉल करने में सक्षम नहीं हूं। मैं देखता हूं कि आपका क्या मतलब है लेकिन बाध्यकारी काम नहीं करता है। – bkovacic

+0

@ पेडाला मैं वाक्यविन्यास गलत हो सकता है। मुझे पता है कि आप 'प्लेसमेंट टाउन' से जुड़ना चाहते हैं, जिसे 'कॉन्टेक्स्टमेनू' से जुड़ा हुआ नियंत्रण वापस करना चाहिए, लेकिन आपको कमांड – Rachel

+0

पर नेविगेट करने के लिए एक अलग वाक्यविन्यास का उपयोग करने की आवश्यकता हो सकती है, जिसे आपने लिखा है बाध्य ग्रिड तक जाता है (एक DataTemplate के अंदर), लेकिन UserControl के DataContext तक नहीं (जहां आदेश है)। यह सवाल है कि क्या बाइंडिंग घोंसला करना संभव है, इसलिए मैं इस ग्रिड से ऊपर जा सकता हूं? – bkovacic

संबंधित मुद्दे