我有一个连接到事件的命令,它确实触发了,但我在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>
由于
答案 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是正确的实现。