Windows phone 7 在SelectionChanged事件上使用交互触发器的正确方法
我有一个连接到事件的命令,因此它确实会触发,但我在CommandParameter中得到的是以前选择的项,或者可能是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
<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
}