2012-06-18 12 views
7

मेरे पास एक सूची दृश्य है जो स्ट्रिंग मानों की एक सूची प्रदर्शित करता है। मैं चयनित आइटम को हटाने के लिए सूची में प्रत्येक आइटम के लिए एक संदर्भ मेनू प्रविष्टि जोड़ना चाहता हूं। मेरे XAML इस तरह दिखता है:सूचीदृश्य में आइटम हटाने के लिए संदर्भ मेनू

<ListView x:Name="itemsListView" ItemsSource="{Binding MyItems}"> 
    <ListView.ContextMenu> 
    <ContextMenu> 
     <MenuItem Header="Remove" 
       Command="{Binding RemoveItem}" 
       CommandParameter="{Binding ElementName=itemsListView, Path=SelectedItem}" /> 
    </ContextMenu> 
    </ListView.ContextMenu> 
</ListView> 

समस्या यह है कि CommandParameter मूल्य हमेशा अशक्त है। मैंने यह आदेश देखने के लिए चयनित आइटम को निकालने के लिए एक अतिरिक्त बटन जोड़ा है कि मेरा आदेश काम करता है या नहीं। बटन बटन बटन के माध्यम से बिल्कुल वही बाध्यकारी और हटाने आइटम है। बटन ऐसा दिखाई देता:

<Button Content="Remove selected item" 
     Command="{Binding RemoveItem}" 
     CommandParameter="{Binding ElementName=itemsListView, Path=SelectedItem}"/> 

आदेश इस तरह दिखता है:

private ICommand _removeItem; 

public ICommand RemoveItem 
{ 
    get { return _removeItem ?? (_removeItem = new RelayCommand(p => RemoveItemCommand((string)p))); } 
} 

private void RemoveItemCommand(string item) 
{ 
    if(!string.IsNullOrEmpty(item)) 
    MyItems.Remove(item); 

} 
कोई भी विचार क्यों चयनित आइटम अशक्त जब संदर्भ मेनू खोलने है

? शायद सूचीदृश्य की एक फोकस समस्या है?

+0

अपने आउटपुट विंडो में एक नज़र RelativeSource उपयोग कर सकते हैं, मुझे यकीन है कि आप एक बाध्यकारी त्रुटि संदेश दिखाई देगा। चूंकि कॉन्टेक्स्टमेनू एक नई विंडो है, मुझे यकीन नहीं है कि यह आइटम लिस्ट व्यू तक पहुंच सकता है। –

+0

http://stackoverflow.com/questions/1013558/elementname-binding-from-menuitem-in-contextmenu और http://stackoverflow.com/questions/2617122/wpf-menuitem-command-binding-to के आसपास एक नज़र डालें -elementname-results-to-system-windows-data-error –

उत्तर

26

H.B. सही है। लेकिन आप यह भी

<ListView x:Name="itemsListView" ItemsSource="{Binding MyItems}"> 
     <ListView.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Remove" 
      Command="{Binding RemoveItem}" 
      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}" /> 
      </ContextMenu> 
     </ListView.ContextMenu> 
    </ListView> 
+0

सापेक्ष स्रोत के साथ काम किया - धन्यवाद! –

3

ContextMenus डिस्कनेक्ट हो गए हैं, तो आप ElementName बाइंडिंग का उपयोग नहीं कर सकते हैं। एक वर्कअराउंड Binding.Source और x:Reference का उपयोग करेगा, जिसके लिए आपको संसाधनों में होने वाले हिस्सों को निकालने की आवश्यकता होती है (चक्रीय निर्भरता त्रुटियों के कारण)। आप बस पूरा संदर्भ मेनू डाल सकते हैं।

एक उदाहरण:

<ListBox Name="lb" Height="200"> 
    <ListBox.Resources> 
     <ContextMenu x:Key="cm"> 
      <MenuItem Header="{Binding ActualHeight, Source={x:Reference lb}}" /> 
     </ContextMenu> 
    </ListBox.Resources> 
    <ListBox.ContextMenu> 
     <StaticResource ResourceKey="cm" /> 
    </ListBox.ContextMenu> 
</ListBox> 
0

इस काम बाइंडिंग मुझे CommandParameter = के लिए "{बाइंडिंग}"

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