在SelectionChanged事件上使用交互式触发器的正确​​方法

时间:2011-04-01 03:15:35

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

我有一个连接到事件的命令,它确实触发了,但我在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>

由于

2 个答案:

答案 0 :(得分:1)

是否值得使用触发器?如果您的XAML元素用于集合(列表框,网格等)被绑定到在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);
        }
    }

我喜欢在我的ViewModel上公开一个属性,它是我所暴露的任何集合的“选定项目”。因此,对于ViewModel,我将使用MVVMINPC片段添加此属性:

    public const string SelectedBillingRecordPropertyName = "SelectedBillingRecord";
    private BillingRecord _selectedBillingRecord = null;
    public BillingRecord SelectedBillingRecord
    {
        get
        {
            return _selectedBillingRecord;
        }

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

            var oldValue = _selectedBillingRecord;
            _selectedBillingRecord = value;

            // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
            RaisePropertyChanged(SelectedBillingRecordPropertyName, oldValue, value, true);
        }
    }

现在,如果将XAML元素的SelectedItem绑定到此公开属性,则在通过数据绑定在视图中选择时,它将填充。

但更好的是,当您利用MVVMINPC片段时,您可以选择是否将结果广播给任何听众。在这种情况下,我们想知道SelectedBillingRecord属性何时更改。因此,您可以在ViewModel的构造函数中使用它:

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

在ViewModel的其他地方,无论你想要采取什么行动:

    private void SelectedRecordChanged(BillingRecord br)
    {
        //Take some action here
    }

希望这会有所帮助......

答案 1 :(得分:0)

我见过同样的问题,发现SelectedItem是正确的实现。