在WP7上的MVVM Light中注册特定的已更改属性

时间:2010-12-30 15:42:38

标签: silverlight mvvm windows-phone-7 messaging mvvm-light

我创建了一个带有列表框的视图,其中显示了一系列汽车。如果用户点击特定的汽车,他需要被发送到不同的视图,其中包含一些详细信息。 绑定属性是普通的MVVM Light属性(带RaisePropertyChanged和所有)。 一些代码片段:

<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应用程序中注册特定对象。

1 个答案:

答案 0 :(得分:2)

我认为另一种方法是创建一个自定义“消息”,仅用于与所需功能相关联。例如,声明CarSelectedMessage然后使用默认广播PropertyChangedMessage<Car>,而不是使用public Car SelectedCar { get { return _selectedCar; } set { _selectedCar = value; RaisePropertyChanged("SelectedCar"); var msg = new CarSelectedMessage(value); Messenger.Default.Send(msg); } } 的默认广播,从视图模型创建并发送自定义消息:

NavigationRequest

一般导航

为了在应用程序中实现导航,我按照this blog post使得从视图模型发出导航请求变得简单。我认为不得不为最新版本的MVVM Light稍微更新一下,请参阅下面的我的版本。

要用作消息的新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));

最后从视图模型中调用导航

{{1}}

希望这有帮助,