簡體   English   中英

在WP7上的MVVM Light中注冊特定的已更改屬性

[英]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。 可能可以使用RaisePropertyChangedRegister做一些事情,這樣你就可以定位一個特定的屬性,但我找不到它似乎找到它。

這里有人有頭緒嗎? 簡而言之:我想在特定屬性上注冊,而不是在我的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM