MVVM EventToCommand参数为NULL

时间:2013-03-25 11:22:10

标签: windows-phone-7 mvvm mvvm-light

我在Windows Phone 7.1中使用MVVM Light Toolkit

ViewModel的一部分:

public RelayCommand<object> ChangeVATCommand
        {
            get
            {
                return _changeVATCommand
                    ?? (_changeVATCommand = new RelayCommand<object>(
                                          (vat) =>
                                          {

                                          }));
            }
        }

Xaml的一部分:

    <toolkit:ListPicker  ItemsSource="{Binding VATs}" x:Name="VATs" SelectedIndex="0"  DisplayMemberPath="Name">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <cmd:EventToCommand Command="{Binding ChangeVATCommand, Mode=OneWay}"
                                    CommandParameter="{Binding Path=SelectedItem, ElementName=VATs}"
                />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </toolkit:ListPicker>

当命令运行时,传递给lambda的vat为null。如果我在xaml CommandParameter中设置为“{Binding ElementName = VATs}”,那么lambda中的vat会使ListPicker具有正确的属性SelectedItem对象(非null)。

这是一个错误或我做错了什么?

更新

要点:

  1. CommandParameter =“{Binding Path = SelectedItem,ElementName = VATs}” - 我有NULL

  2. CommandParameter =“{Binding Path = SelectedIndex,ElementName = VATs}” - 工作正常!我有所选大桶的索引

  3. CommandParameter =“{Binding,ElementName = VATs}” - 工作正常!我有正确的选择列表的ListPicker

2 个答案:

答案 0 :(得分:3)

我宁愿建议将ListPicker的SelectedItem绑定到VM上的属性的双向绑定。然后从Command中,您可以轻松访问此属性。

如果您选择此解决方案,您可能甚至不需要Command,您可以直接从VM中的SelectedItem属性中触发计算。

干杯 劳伦

答案 1 :(得分:0)

我不久前遇到了类似的问题,解决方案是指示相应的VM:

<toolkit:ListPicker  ItemsSource="{Binding VATs}" x:Name="VATs" SelectedIndex="0"  DisplayMemberPath="Name">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cmd:EventToCommand Command="{Binding Path=ViewModelName.ChangeVATCommand, Source={StaticResource Locator}, Mode=OneWay}"
                                CommandParameter="{Binding Path=SelectedItem, ElementName=VATs}"
            />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</toolkit:ListPicker>

请注意,现在绑定引用了ViewModel并使用Locator作为源。