在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