14

ComboBoxのSelectedItemChangeEventをビューモデルのICommandに接続しました。すべてが正常に機能しているようですが、ComboxBoxのSelectedItemを取得する方法がわかりません。EventToCommandのCommandParameterを使用する必要があると思います-これを、ComboBoxのselectedItemを持つViewModel内の何かにバインドしますか?私はこれを試しました:

<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のExecuteメソッドのパラメーターは常にnullです。私はSilverLightにかなり慣れていないので、ここで明らかな何かが本当に欠けていると思います。誰か助けてもらえますか?前もって感謝します!

4

2 に答える 2

20

いくつか掘り下げた後、実際のSelectionChangedEventArgsをICommandの実行パラメーターとして渡すのは非常に簡単であることがわかりました。

設定するだけ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>

次に、Executeメソッドで次のようにします。

public void Execute(object parameter)
{
    SelectionChangedEventArgs e = (SelectionChangedEventArgs)parameter;
    CategoryType categoryType = (CategoryType)e.AddedItems[0];
}
于 2010-06-28T09:17:16.077 に答える
7

CommandParameterを追加して、relayCommandにリストを渡してみてください。

このページの下部に似たようなものが説明されていますが、データグリッドがあります: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;
    });
于 2011-01-04T17:55:42.283 に答える