在Prism,MVVM,Windows 8.1 StoreApp中,我希望ViewModel捕获ListView中的SelectItem。 ListView包含一个ObservableCollection对象。 ViewModel需要查找选定对象的更多细节并通知视图。该视图反过来应该显示对象的细节。Prism MVVM模式:视图始终落后于ViewModel中属性更改的一步
我已经实现了这一点,但视图显示百达前者的对象
当然,我正在寻找的是在视图立即和正确反应的选择(选择一个新的后)目的。这里是我的codenippets,全部用VB代码。
编辑:我已经提出了另一个 - 更小的例子,使用这种方法。我做了一个过程的记录in this video.请再阅读之前看看它!
的对象来自视图模型为:
公共财产的人作为新的ObservableCollection(人)
他们被绑定到用户控件:
<Grid>
<ListView
ItemsSource="{Binding Persons}"
ItemTemplate="{StaticResource BusinessCard}">
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="SelectionChanged">
<Behaviors:ListViewSelectionChangedAction/>
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</ListView>
</Grid>
通过行为最终会通过此代码在ViewModel中结束:
Sub New(InjectedEventAggregator As IEventAggregator)
LocalEventAggregator = InjectedEventAggregator
LocalEventAggregator.GetEvent(Of PersonIsSelectedEvent)().Subscribe(AddressOf HandlePersonIsSelected, True)
此事件是由这个程序
Public Sub HandlePersonIsSelected(ByVal SelectedPerson As Person)
ActualPerson = SelectedPerson
End Sub
这一切的最后部分处理的是包含ActualPerson像这样的属性:
Private Property _ActualPerson As Person
Public Property ActualPerson As Person
Get
Return _ActualPerson
End Get
Set(value As Person)
SetProperty(_ActualPerson, value)
End Set
End Property
编辑:,这是应显示所选ActualPerson的XAML:
<StackPanel DataContext="{Binding ActualPerson}" >
<Image Source="{Binding Photo}" Stretch="Fill" />
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text="{Binding FamilyName}" />
<TextBlock Text="{Binding Gender}" />
</StackPanel>
</StackPanel>
当我遍历代码时,可以看到SelectedItem事件在ViewModel中被捕获,所选人员的处理程序被调用,属性被更新。这也意味着使用Prism会触发NotifyPropertyChanged事件。它确实被解雇了,否则前一个对象就不会显示我想的。
但是,为什么视图没有用正确的(Person)对象更新immediatelty?
如果您有线索....成为我的嘉宾!
Regards
您尚未显示'视图反过来应显示对象的详细信息'的代码。如果XAML代码绑定到ActualPerson对象,它应该显示ActualPerson的详细信息。你可以尝试将TextBlock的Text属性绑定到ActualPerson。并检查你看到的是什么。 –
2014-08-31 15:35:57
@Wonderfulworld感谢您的反馈。我在原文中进行了编辑。从列表视图中选择的对象是一个人。基于此,ActualPerson属性被刷新。问题不是绑定本身,而是时机:只有前一个对象才完整显示。绑定到其他属性的作品,但反应相同滞后:总是在前一次点击中选择的对象。 – user2366741 2014-08-31 20:49:50
你的代码对我来说是正确的。只要调用“ActualPerson = SelectedPerson”,UI就会更新。除非ActualPerson是之前的对象,否则您应该看到最近点击过的人。在ActualPerson的Set操作中放置一个断点并查看它是否被调用两次,并且是任何将最新对象设置回前一个对象的人。 – 2014-09-01 07:47:51