MVVM光:从视图中传递对象视图模型 [英] MVVM light: Pass object from view to viewmodel

查看:146
本文介绍了MVVM光:从视图中传递对象视图模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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




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


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

      ReservoirViewerCommand.Execute(NULL); 


  3. 在视图模型I类实例化的命令,并与所选对象发送消息:

      ReservoirViewerCommand =新RelayCommand(OpenReservoir); 
    私人无效OpenReservoir()
    {
    Messenger.Default.Send(新LaunchShowReservoirMessage(){水库= SelectedReservoir});
    }



    其中:

     类LaunchShowReservoirMessage:MessageBase 
    {
    公共水库水库{搞定;组; }
    }


  4. 该MAINVIEW注册信息,并打开一个新的子窗口:

     私人无效RegisterMessages()
    {
    Messenger.Default.Register< LaunchShowReservoirMessage>(这一点,OnLaunchShowReservoir );
    }

    公共无效OnLaunchShowReservoir(LaunchShowReservoirMessage味精){
    变种showReservoir =新ReservoirViewerView();
    showReservoir.Show();
    }




我需要的是新的视图模型(ReservoirViewerViewModel)能以某种方式通过消息得到传递的对象中保持这样我就可以显示在子窗口中的此对象的详细信息。



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


解决方案

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




请确保你实际上视图结合使用下列之一的视图模型:



代码隐藏

  VAR showReservoir =新ReservoirViewerView(); 
showReservoir.DataContext = ViewModelLocator.ReservoirViewerViewModel; //静态属性
// OR = showReservoir.DataContext新ReservoirViewerViewModel();
showReservoir.Show();

XAML视图



 <窗​​口x:类=Garmin.Cartography.AdminBucketTools.ChildWindowView
的xmlns =htt​​p://schemas.microsoft.com/winfx/2006/ XAML /演示
的xmlns:X =http://schemas.microsoft.com/winfx/2006/xaml
的DataContext ={绑定路径= ReservoirViewerViewModel源= {StaticResource的定位}} >
<! - 使用非静态属性在ViewModelLocator - >

<网/>
< /窗GT;

的XAML资源



 <数据类型的DataTemplate ={X:类型的ViewModels:ReservoirViewerViewModel}> 
<访问量:ReservoirViewerView />
< / DataTemplate中>




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




简单在ReservoirViewerViewModel类注册了同样的信息:

  Messenger.Default.Register< LaunchShowReservoirMessage>(这一点,(MSG)=​​> ; 
{
变种水库= msg.Reservoir;
});



仅供参考,如果你得到来自GenericMessage<消息类; [内容类型]>而不是MessageBase,然后您可以使用GenericMessage类的已定义的内容属性。例如:

 公共类LaunchShowReservoirMessage:GenericMessage<储存器GT; 
{
公共LaunchShowReservoirMessage(水库含量):基地(内容){}
}

和则:

  Messenger.Default.Register< LaunchShowReservoirMessage>(这一点,(MSG)=​​> 
{
变种水库= msg.Content;
});


I 've recently started working with WPF using MVVM light and I have the following (simple scenario).

  1. MainWindow contains a listbox of elements.

  2. When one is selected and the button is clicked, I fire a command:

    ReservoirViewerCommand.Execute(null);
    

  3. On the viewmodel class I instantiate the command and send a message with the selected object:

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

    where:

    class LaunchShowReservoirMessage:MessageBase
    {
        public Reservoir Reservoir { get; set; }
    }
    

  4. The mainview registers the message and opens a new child window:

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

What I need is that the new ViewModel (ReservoirViewerViewModel) can somehow get hold of the passed object through the message so that I can then display the details of this object on the child window.

I did some step-by-step debugging and the ViewModel constructor seems never to be reached.

解决方案

"I did some step-by-step debugging and the ViewModel constructor seems never to be reached."

Make sure that you are actually binding your view to your view model using one of the following:

In CodeBehind

var showReservoir = new ReservoirViewerView();
showReservoir.DataContext = ViewModelLocator.ReservoirViewerViewModel; //static property
//OR showReservoir.DataContext = new ReservoirViewerViewModel();
showReservoir.Show();

In Xaml View

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

In Xaml Resources

<DataTemplate DataType="{x:Type viewmodels:ReservoirViewerViewModel}">
    <views:ReservoirViewerView/>
</DataTemplate>

"What I need is that the new ViewModel (ReservoirViewerViewModel) can somehow get hold of the passed object through the message so that I can then display the details of this object on the child window."

Simply register for the same message in your ReservoirViewerViewModel class:

Messenger.Default.Register<LaunchShowReservoirMessage>(this, (msg) =>
{
    var reservoir = msg.Reservoir;
});

FYI, if you derive your message class from GenericMessage<[content type]> instead of MessageBase, then you can use the already-defined Content property of the GenericMessage class. For example:

public class LaunchShowReservoirMessage: GenericMessage<Reservoir>
{
    public LaunchShowReservoirMessage(Reservoir content) : base(content) { }
}

And then:

Messenger.Default.Register<LaunchShowReservoirMessage>(this, (msg) =>
{
    var reservoir = msg.Content;
});

这篇关于MVVM光:从视图中传递对象视图模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆