繁体   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