Windows phone 7 在SelectionChanged事件上使用交互触发器的正确方法

Windows phone 7 在SelectionChanged事件上使用交互触发器的正确方法,windows-phone-7,mvvm-light,relaycommand,eventtrigger,Windows Phone 7,Mvvm Light,Relaycommand,Eventtrigger,我有一个连接到事件的命令,因此它确实会触发,但我在CommandParameter中得到的是以前选择的项,或者可能是SelectionChanged完成之前选择的项 无论哪种方式,都不确定要更改什么以从事件中获取新选择的项 <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <cmd:EventToCommand Command="{Binding Mai

我有一个连接到事件的命令,因此它确实会触发,但我在CommandParameter中得到的是以前选择的项,或者可能是SelectionChanged完成之前选择的项

无论哪种方式,都不确定要更改什么以从事件中获取新选择的项

<i:Interaction.Triggers>
  <i:EventTrigger EventName="SelectionChanged">
    <cmd:EventToCommand 
    Command="{Binding Main.SelectedRecordCommand, Source={StaticResource Locator}}" 
    CommandParameter="{Binding SelectedItem, ElementName=listBillingRecords}" 
    />
   </i:EventTrigger>
</i:Interaction.Triggers>


谢谢

使用触发器值得吗?如果集合的XAML元素(listbox、grid等)绑定到在viewmodel上公开集合的属性,则可以利用数据绑定和内置的MVVM Light messenger以更为MVVM友好的方式通知您新旧值的属性更改。这个例子不一定是特定于WP7的,但我认为它也会起同样的作用

例如,这可能是数据绑定集合:

    public const string BillingRecordResultsPropertyName = "BillingRecordResults";
    private ObservableCollection<BillingRecord> _billingRecordResults = null;
    public ObservableCollection<BillingRecord> BillingRecordResults
    {
        get
        {
            return _billingRecordResults;
        }

        set
        {
            if (_billingRecordResults == value)
            {
                return;
            }

            var oldValue = _billingRecordResults;
            _billingRecordResults = value;

            // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
            RaisePropertyChanged(BillingRecordResultsPropertyName, oldValue, value, true);
        }
    }
现在,如果您将XAML元素的SelectedItem绑定到这个公开的属性,那么当通过数据绑定在视图中选择时,它将填充

但更好的是,当您利用代码片段MVVMINPC时,您可以选择是否将结果广播给任何正在收听的人。在本例中,我们想知道SelectedBillingRecord属性何时更改。因此,您可以在ViewModel的构造函数中包含以下内容:

Messenger.Default.Register<PropertyChangedMessage<BillingRecord>>(this, br => SelectedRecordChanged(br.NewValue));

希望这有帮助……

我也看到了同样的问题,并发现SelectedItem是正确的实现。

是。。很好的回答。。完全同意你所说的。我已经在使用一个可观察的集合和一个在我的视图模型中激发raisepropchanged的道具。不过也有一些问题。首先,如果我向SelectedItem放置一个双向绑定,它在第一次传递时为null,并且我得到一个超出范围的索引。其次,视图模型中的选定项或我的对象有很多更新方式。在这种情况下,我只想知道它所在的listview何时发生更改,所以我使用了relay命令。好的,我明白为什么现在选择使用触发器了。ug。。。所以我有一个页面,一个控件,我需要监控它在我的模型中这个对象的变化。否则,我必须在收到更改通知的方法中做一些疯狂的事情。建议?我在viewmodel上创建了仅由listbox使用的第二个属性。现在。。。我可以在另一个更改时更新它。是否绑定到selecteditem?我曾考虑过建议使用第二个属性,但不确定这是否解决了双向绑定中的null项问题。此外,我永远无法确定这样的辅助属性(专门用于从视图中的一个XAML元素公开某些内容)是否会玷污viewmodel和view之间的清晰区别。很高兴你找到了可行的方法!
Messenger.Default.Register<PropertyChangedMessage<BillingRecord>>(this, br => SelectedRecordChanged(br.NewValue));
    private void SelectedRecordChanged(BillingRecord br)
    {
        //Take some action here
    }