[英]Register on specific changed property in MVVM Light on WP7
我創建了一個帶有列表框的視圖,其中顯示了一系列汽車。 如果用戶點擊特定的汽車,他需要被發送到不同的視圖,其中包含一些詳細信息。 綁定屬性是普通的MVVM Light屬性(使用RaisePropertyChanged
和all)。 一些代碼片段:
<ListBox ItemsSource="{Binding Cars}" SelectedItem="{Binding SelectedCar, Mode=TwoWay}">
在開發這個應用程序時,我發現我可以使用MVVM Light的Messenger對象注冊屬性更改事件,如下所示:
Messenger.Default.Register<PropertyChangedMessage<Car>>(this, (action) =>
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
DoViewDetail();
});
});
但是,如果我是正確的,這將在整個應用程序中注冊每個已更改的Car。 可能可以使用RaisePropertyChanged
或Register
做一些事情,這樣你就可以定位一個特定的屬性,但我找不到它似乎找到它。
這里有人有頭緒嗎? 簡而言之:我想在特定屬性上注冊,而不是在我的MVVM Light應用程序中注冊特定對象。
我認為一種替代方法是創建一個自定義“消息”,以僅與所需的功能結合使用。 例如,聲明一個CarSelectedMessage
,然后使用視圖模型創建並發送自定義消息,而不是使用PropertyChangedMessage<Car>
的默認廣播:
public Car SelectedCar {
get { return _selectedCar; }
set {
_selectedCar = value;
RaisePropertyChanged("SelectedCar");
var msg = new CarSelectedMessage(value);
Messenger.Default.Send(msg);
}
}
為了在應用程序中實現導航,我關注了這篇博客文章 ,以簡化從視圖模型發出導航請求的過程。 我認為它必須針對MVVM Light的最新版本進行一些更新,請參閱下面的版本。
新的NavigationRequest
類將用作消息:
public class NavigationRequest
{
public NavigationRequest(Uri uri)
{
DestinationAddress = uri;
}
public Uri DestinationAddress
{
get;
private set;
}
}
在應用程序主視圖的構造函數中注冊請求:
Messenger.Default.Register<NavigationRequest>(this,
(request) => DispatcherHelper.CheckBeginInvokeOnUI(
() => NavigationService.Navigate(request.DestinationAddress)));
最后用於從視圖模型調用導航
var uri = new Uri("/MyPage.xaml", UriKind.Relative);
Messenger.Default.Send(new NavigationRequest(uri));
希望這可以幫助,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.