我创建了一个带有列表框的视图,其中显示了一系列汽车。如果用户点击特定的汽车,他需要被发送到不同的视图,其中包含一些详细信息。
绑定属性是普通的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。可能可以使用RaisePropertyChanged
或Register
执行某些操作,以便您可以定位特定属性,但我找不到它。
这里的任何人都有线索或抬头? 简而言之:我想在特定属性上注册,而不是在我的MVVM Light应用程序中注册特定对象。
答案 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}}
希望这有帮助,