2010-06-28 22 views
14

के साथ EventToCommand का उपयोग करके, मैंने अपने दृश्य मॉडल में एक कॉम्बोबॉक्स के चयनित इटैम चेंजएवेंट को आईसीओएमएंड में जोड़ दिया है। सबकुछ ठीक काम करता प्रतीत होता है हालांकि मुझे नहीं पता कि कॉमबॉक्सबॉक्स के चयनित इटैम को कैसे प्राप्त किया जाए। मुझे लगता है कि मुझे EventToCommand के कमांड पैरामीटर का उपयोग करने की आवश्यकता है - क्या मैं इसे अपने व्यूमोडेल में कुछ से जोड़ता हूं जिसमें कॉम्बोबॉक्स का चयनित इटैम है? मैं इस की कोशिश की है:एमवीवीएम-लाइट सिल्वरलाइट, एक कॉम्बोबॉक्स

<ComboBox 
    Width="422" 
    Height="24" 
    DisplayMemberPath="Name" 
    ItemsSource="{Binding CategoryTypes}" 
    SelectedItem="{Binding SelectedCategory}" 
    > 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <MvvmLight:EventToCommand 
       Command="{Binding SelectCategoryCommand,Mode=TwoWay}" 
       CommandParameter="{Binding SelectedCategory, Mode=TwoWay}" 
       MustToggleIsEnabledValue="True" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ComboBox> 

और मेरे विचार मॉडल में:

public ICommand SelectCategoryCommand 
{ 
    get 
    { 
     return new SelectCategoryCommand(this); 
    } 
} 

public CategoryType SelectedCategory 
{ 
    get; set; 
} 

और ICommand

public class SelectCategoryCommand : ICommand 
{ 
    private RowViewModel _rowViewModel; 

    public SelectCategoryCommand(RowViewModel rowViewModel) 
    { 
     _rowViewModel = rowViewModel; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     CategoryType categoryType = (CategoryType) parameter; 
    } 

} 

हालांकि ICommand की विधि निष्पादित में पैरामीटर हमेशा रिक्त है। मैं सिल्वरलाइट के साथ काफी अनुभवहीन हूं इसलिए मुझे लगता है कि मैं वास्तव में कुछ स्पष्ट रूप से याद कर रहा हूं। क्या कोई मदद कर सकता है? अग्रिम में धन्यवाद!

उत्तर

20

कुछ खुदाई मैंने पाया कि यह ICommand के अमल पैरामीटर के रूप में वास्तविक SelectionChangedEventArgs पारित करने के लिए बहुत आसान है करने के बाद:

:

बस PassEventArgsToCommand="True"

<ComboBox Width="422" 
      Height="24" 
      DisplayMemberPath="Name" 
      ItemsSource="{Binding CategoryTypes}" 
      SelectedItem="{Binding SelectedCategory}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <MvvmLight:EventToCommand Command="{Binding SelectCategoryCommand,Mode=TwoWay}" 
             MustToggleIsEnabledValue="True" 
             PassEventArgsToCommand="True"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ComboBox> 

और फिर निष्पादित विधि में सेट की तरह कुछ करना

public void Execute(object parameter) 
{ 
    SelectionChangedEventArgs e = (SelectionChangedEventArgs)parameter; 
    CategoryType categoryType = (CategoryType)e.AddedItems[0]; 
} 
+0

आपको अपना जवाब विशेष रूप से चिह्नित करना चाहिए क्योंकि इससे आपकी समस्या हल हो गई है। – kevindaub

+0

thanx एक बंडल आदमी, मेरा दिन बचाओ – zeeshan

7

आप कमांड पैरामीटर जोड़ने और अपने रिले में एक सूची उत्तीर्ण करने का प्रयास कर सकते हैं कमांड

कुछ समान इस पेज के नीचे की ओर है, लेकिन एक datagrid के साथ वर्णित है: http://mvvmlight.codeplex.com/ उस पृष्ठ से कोड इस तरह दिखता है:

<sdk:DataGrid x:Name="MyDataGrid" ItemsSource="{Binding Items}"> 
    <i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectionChanged"> 
    <cmd:EventToCommand Command="{Binding SelectionChangedCommand}" 
         CommandParameter="{Binding SelectedItems, ElementName=MyDataGrid}" /> 
    </i:EventTrigger> 
    </i:Interaction.Triggers> 
</sdk:DataGrid> 

आप ऐसा करते हैं, तो आपके relayCommand से निपटने के लिए की आवश्यकता होगी मापदंडों अपने ViewModel में आ कुछ इस तरह:।

public RelayCommand<IList> SelectionChangedCommand{ get; private set;} 

...

SelectionChangedCommand = new RelayCommand<IList>(
    items => 
    { 
     if (items == null) 
     { 
      NumberOfItemsSelected = 0; 
      return; 
     } 
     //Do something here with the records selected that were passed as parameters in the list 
     //example: NumberOfItemsSelected = items.Count; 
    }); 
संबंधित मुद्दे