2012-01-01 19 views
5

में चयन चयन में मुझे कैसा लगाया जा सकता है ListBox नियंत्रण कमांड प्रॉपर्टी को लागू नहीं करता है। मुझे SelectionChanged ईवेंट में कुछ कार्यक्षमता संलग्न करनी है। कोई जानता है कि मैं इसे कैसे कर सकता हूं? कृपया मेरी मदद करोएमवीवीएम लिस्टबॉक्स सिल्वरलाइट

उत्तर

18

मैं SelectedItem पर बाध्यकारी उपयोग करना और बाध्यकारी संपत्ति की सेटिंग में किसी भी कार्यक्षमता को लागू करना पसंद करता हूं।

<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" /> 

...

public class ViewModel 
{ 
    public IEnumerable<Item> Items { get; set; } 

    private Item selectedItem; 
    public Item SelectedItem 
    { 
     get { return selectedItem; } 
     set 
     { 
      if (selectedItem == value) 
       return; 
      selectedItem = value; 
      // Do logic on selection change. 
     } 
    } 
} 
+0

उत्कृष्ट टिप, धन्यवाद – James

+0

क्या यह एकाधिक चयन के साथ काम करेगा? – Simsons

+0

@ सिमन्स केवल तभी यदि आपके पास एकाधिक चयन से जुड़ने का कोई तरीका है। मेरा मानना ​​है कि बहु-चयन के दौरान चयनित इटैम संपत्ति को अनदेखा किया जाता है। –

1

सोचो लॉरेंट Bugnion से इस पोस्ट आप समस्या को हल करने में मदद मिलेगी:

http://geekswithblogs.net/lbugnion/archive/2010/05/19/handling-datagrid.selecteditems-in-an-mvvm-friendly-manner.aspx

पोस्ट के ऊपर डेटा ग्रिड का उल्लेख है लेकिन मैं इसे ListBox के साथ भी काम करेगा लगता!

सर्वश्रेष्ठ संबंध और नया साल मुबारक हो !! :)

0

मैं RelayCommand का उपयोग करने का सुझाव दूंगा। या तो MVVM Light Toolkit का उपयोग करें या और CommandManager कक्षाओं का उपयोग Josh Smith's implementations से करें। मैं व्यक्तिगत रूप से केवल दो वर्गों का उपयोग करता हूं, इसलिए मुझे पूरे टूलकिट की आवश्यकता नहीं है।

हालांकि यह निश्चित रूप से काम करेगा, आप जो भी कर रहे हैं उसके आधार पर एक आसान तरीका हो सकता है। ListBox के किसी ऑब्जेक्ट को SelectedValue पर बाध्य करना और उस मान को बदलने के लिए सुनना आसान हो सकता है।

+0

धन्यवाद सब कुछ मदद के लिए) नया साल मुबारक हो !!! –

2

मूल रूप से आप कुछ ही विकल्प हैं:

  1. बैकएंड में एक संपत्ति के लिए बाध्य करने के लिए ListBox के संपत्ति SelectedItem का प्रयोग करें (यानी दृश्य मॉडल में) और कैमरून मैकफ़ारलैंड द्वारा वर्णित सेटटर में तर्क निष्पादित करें।
  2. लिंक पेड्रो लामाओं द्वारा पोस्ट की तरह व्यवहार को आदेश एक सामान्य घटना है कि कोई तीसरा पक्ष पुस्तकालय का उपयोग करें।
  3. आप तृतीय पक्ष लाइब्रेरी या संपत्ति सेटर अंदर तर्क लेखन का उपयोग नहीं करना चाहते हैं, तो किसी भी तरह अस्वीकार्य आप ListBox नियंत्रण के लिए अपने खुद के व्यवहार बना सकते हैं। यह नियंत्रण के SelectionChanged ईवेंट की सदस्यता लेगा और एक आदेश निष्पादित करेगा (आदेश व्यवहार द्वारा उजागर निर्भरता संपत्ति हो सकता है)।
15

यह मैं आपको बता दूँ कि कमान संपत्ति केवल बटन में काम करते हैं जिस तरह से जहां आप चुनाव तक पहुँच सकते हैं आपका MVVM आवेदन सभी के प्रथम में बदले गए ईवेंट अब हम स्पष्ट रूप से हमारे चयन बदला गया घटना में है कि संपत्ति के लिए बाध्य करने के लिए है सूची बॉक्स या कॉम्बो बॉक्स आपका XMAL में की तरह फाइल

<ListBox Name="MyListBox" ItemsSource="{Binding ListItems}" Height="150" Width="150" Margin="281,32,-31,118"> 

     <Local:Interaction.Triggers> 
      <Local:EventTrigger EventName="SelectionChanged"> 
       <Local:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=MyListBox,Path=SelectedItem}"/> 
      </Local:EventTrigger> 
     </Local:Interaction.Triggers> 
    </ListBox> 
यह आप dll Syatem.Windows जोड़ने के लिए के लिए

।अन्तरक्रियाशीलता अब यू अपने ViewModel कक्षा में तरह

xmlns:Local="clr-namespace:System.Windows.Interactivityassembly=System.Windows.Interactivity" 

अपने XAML फाइल नाम स्थान में संदर्भ जोड़ने के लिए आप कोन संरचना में आपके कमान को परिभाषित करने के लिए है

public ViewModel123() 
    { 
     MyCommand = new RelayCommand<string>(TestMethod); 

    } 

अब TestMethod विधि है जो संभाल कर सकते हैं बनाने के चयन बदल घटना

private void TestMethod(string parameter) 
    { 
     MessageBox.Show(parameter); 
    } 

मैं इस यू मदद मिल सकती है उम्मीद है।

+0

मैं इस तरह से पसंद करता हूं क्योंकि मुझे लगता है कि यह क्लीनर है। –