MVVM光:从视图传递对象视图模型(MVVM light: Pass object from vie

2019-06-26 11:33发布

我最近开始使用MVVM光WPF工作,我有以下的(简单的场景)。

  1. 主窗口包含元素的列表框。

  2. 当一个人被选中并单击该按钮时,我火了一个命令:

     ReservoirViewerCommand.Execute(null); 
  3. 在视图模型I类实例化命令,并与所选择的对象发送消息:

     ReservoirViewerCommand = new RelayCommand(OpenReservoir); private void OpenReservoir() { Messenger.Default.Send(new LaunchShowReservoirMessage(){Reservoir=SelectedReservoir}); } 

    哪里:

     class LaunchShowReservoirMessage:MessageBase { public Reservoir Reservoir { get; set; } } 
  4. 该MAINVIEW注册消息,并打开一个新的子窗口:

     private void RegisterMessages() { Messenger.Default.Register<LaunchShowReservoirMessage>(this,OnLaunchShowReservoir); } public void OnLaunchShowReservoir(LaunchShowReservoirMessage msg) { var showReservoir = new ReservoirViewerView(); showReservoir.Show(); } 

我需要的是新的视图模型(ReservoirViewerViewModel)能以某种方式通过消息得到传递的对象的持有,这样我可以再显示子窗口中的这个对象的细节。

我做了一些一步一步的调试和视图模型构造似乎从未达到。

Answer 1:

“我做了一些一步一步的调试和视图模型构造似乎从未达到。”

请确保您有您的观点实际上结合使用下面的一个视图模型:

代码隐藏

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;
});


Answer 2:

我不是一个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... } ...


文章来源: MVVM light: Pass object from view to viewmodel