我最近开始使用MVVM光WPF工作,我有以下的(简单的场景)。
主窗口包含元素的列表框。
当一个人被选中并单击该按钮时,我火了一个命令:
ReservoirViewerCommand.Execute(null);
在视图模型I类实例化命令,并与所选择的对象发送消息:
ReservoirViewerCommand = new RelayCommand(OpenReservoir); private void OpenReservoir() { Messenger.Default.Send(new LaunchShowReservoirMessage(){Reservoir=SelectedReservoir}); }
哪里:
class LaunchShowReservoirMessage:MessageBase { public Reservoir Reservoir { get; set; } }
该MAINVIEW注册消息,并打开一个新的子窗口:
private void RegisterMessages() { Messenger.Default.Register<LaunchShowReservoirMessage>(this,OnLaunchShowReservoir); } public void OnLaunchShowReservoir(LaunchShowReservoirMessage msg) { var showReservoir = new ReservoirViewerView(); showReservoir.Show(); }
我需要的是新的视图模型(ReservoirViewerViewModel)能以某种方式通过消息得到传递的对象的持有,这样我可以再显示子窗口中的这个对象的细节。
我做了一些一步一步的调试和视图模型构造似乎从未达到。
“我做了一些一步一步的调试和视图模型构造似乎从未达到。”
请确保您有您的观点实际上结合使用下面的一个视图模型:
在代码隐藏
var showReservoir = new ReservoirViewerView();
showReservoir.DataContext = ViewModelLocator.ReservoirViewerViewModel; //static property
//OR showReservoir.DataContext = new ReservoirViewerViewModel();
showReservoir.Show();
在XAML视图
<Window x:Class="Garmin.Cartography.AdminBucketTools.ChildWindowView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding Path=ReservoirViewerViewModel, Source={StaticResource Locator}}">
<!--Use the non-static property in your ViewModelLocator-->
<Grid />
</Window>
在XAML资源
<DataTemplate DataType="{x:Type viewmodels:ReservoirViewerViewModel}">
<views:ReservoirViewerView/>
</DataTemplate>
“我需要的是新的视图模型(ReservoirViewerViewModel)能以某种方式通过消息得到传递的对象的持有,这样我可以再显示子窗口中的这个对象的细节。”
只需在您的ReservoirViewerViewModel类相同的信息进行注册:
Messenger.Default.Register<LaunchShowReservoirMessage>(this, (msg) =>
{
var reservoir = msg.Reservoir;
});
仅供参考,如果从GenericMessage派生消息类别<[内容类型]>而不是MessageBase,那么就可以使用GenericMessage类的已经定义的内容属性。 例如:
public class LaunchShowReservoirMessage: GenericMessage<Reservoir>
{
public LaunchShowReservoirMessage(Reservoir content) : base(content) { }
}
然后:
Messenger.Default.Register<LaunchShowReservoirMessage>(this, (msg) =>
{
var reservoir = msg.Content;
});
我不是一个MVVM专家,但我想定位到一个新视图点击列表框项目后,显示我的东西,我想在这个新的视图来显示物体内发送新邮件,然后我浏览到。 我写这篇文章,因为我认为你的做法是有点复杂,但是我是一个Windows Phone应用程序开发人员,所以相应地采取此评论。
无论如何,消息的第一个功能是允许通信通过的ViewModels,所以在我看来,你也应该在ReservoirViewerViewModel使用msg.Reservoir注册的消息,并在这里得到了水库“附件”。
在ReservoirViewerViewModel:
private void RegisterMessages()
{
Messenger.Default.Register<LaunchShowReservoirMessage>(this, ReservoirReceived);
}
private void ReservoirReceived(LaunchShowReservoirMessage msg) {
this.LocalReservoir = msg.Reservoir;
}
public Reservoir LocalReservoir { get... set... } ...