[英]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.