Windows phone 7 如何在MVVM Light中将数据传递到不同的视图?

Windows phone 7 如何在MVVM Light中将数据传递到不同的视图?,windows-phone-7,mvvm,mvvm-light,Windows Phone 7,Mvvm,Mvvm Light,我不太清楚如何将数据传递给其他视图。我想有三种方法可以做到这一点,但我不知道如何做到其中的两种 通过messenger发送数据(不确定您是否可以发送对象,否则如果您必须发送10条数据或类似的内容,我会看到事情变得非常混乱) 以某种方式将数据传递给新视图模型的构造函数。我说“不知何故”,因为我不清楚在使用IOC容器(在本例中为内置容器)时如何做到这一点 通过参数传递数据。我看到了一些教程,向您展示了如何在windows phone上进行导航,但没有一个真正谈到参数传递。我猜这仍然是一种选择 据我所

我不太清楚如何将数据传递给其他视图。我想有三种方法可以做到这一点,但我不知道如何做到其中的两种

  • 通过messenger发送数据(不确定您是否可以发送对象,否则如果您必须发送10条数据或类似的内容,我会看到事情变得非常混乱)

  • 以某种方式将数据传递给新视图模型的构造函数。我说“不知何故”,因为我不清楚在使用IOC容器(在本例中为内置容器)时如何做到这一点

  • 通过参数传递数据。我看到了一些教程,向您展示了如何在windows phone上进行导航,但没有一个真正谈到参数传递。我猜这仍然是一种选择

  • 据我所知,选项1是一种老办法。选项2似乎是一个更新的方法和更好的方法,但我找不到任何关于人们如何做的例子


    我不知道怎么做,因为Ioc应该创建视图的实例,所以当数据不存在时,如何将数据传递给它?

    我这样做的两种主要方式是:

    1) 使用messenger:

    发件人类别:

    public class TrafficLight
    {
        public string Color{get;set;}
        public TimeSpand Duration{get;set;}
    }
    public class TrafficLightService
    {
         public void SendLight(TrafficLight light)
         {
             Messenger.Default.Send(light);
         }
    }
    
    接收人:

    public class MyViewModel
    {
         public MyViewModel()
         {
            Messenger.Default.Register<TrafficLight>(DoSomethingWithTrafficLight);
         }
         private void DoSomethingWithTrafficLight(TrafficLight light)
         {
         }
    }
    
    公共类MyViewModel
    {
    公共MyViewModel()
    {
    Messenger.Default.Register(DoSomethingWithTrafficLight);
    }
    带交通灯(交通灯)的专用真空度计
    {
    }
    }
    
    这里发生的是源对象将Messenger用作事件代理。对象A不需要知道对象B,他们只需要知道messenger

    (二)

    只需使用依赖项注入:

         public class TrafficLight
            {
                public string Color{get;set;}
                public TimeSpand Duration{get;set;}
            }
        public class LightEventArgs:EventArgs
        {
            public LightEventArgs(TrafficLight light)
            {
                _light=light;
            }
            public TrafficLight Light{get{return _light;}}
        }
    
            public interface ITrafficLightService
            {
                void SendLight(TrafficLight light);
                public event EventHandler<LightEventArgs> TrafficLightSet;
            }
            public class TrafficLightService
            {
                 public void SendLight(TrafficLight light)
                 {
                     Messenger.Default.Send(light);
                 }
                 public event EventHandler<LightEventArgs> TrafficLightSet;
            }
    
    public class TrafficLightSenderViewModel
    {
        public TrafficLightSenderViewModel(ITrafficLightService trafficLightService)
        {
            _trafficLightService=trafficLightService;
            _trafficLightService.Send(new TrafficLight{Color="Red"});
        }
    }
    
    public class TrafficLightReceiverViewModel
    {
        public TrafficLightReceiverViewModel(ITrafficLightService trafficLightService)
        {
            _trafficLightService=trafficLightService;
            _trafficLightService.TrafficLightSet+= TrafficLightNotification;
        }
    
        private void TrafficLightNotification(TrafficLightEventArgs args)
        {
             DoSomethingWithTheLight(args.Light);
        }
    }
    
    public class ViewModelLocator
    {
        public ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
    
            if (ViewModelBase.IsInDesignModeStatic)
            {
                SimpleIoc.Default.Register<ITrafficLightService, Design.TrafficLightService>();
            }
            else
            {
                SimpleIoc.Default.Register<ITrafficLightService, TrafficLightService>();         
            }
    
            SimpleIoc.Default.Register<TrafficLightSenderViewModel>();
            SimpleIoc.Default.Register<TrafficLightReceiverViewModel>();
        }
    
        public MainViewModel Sender
        {
            get { return SimpleIoc.Default.GetInstance<TrafficLightSenderViewModel>(); }
        }
        public MainViewModel Receiver
        {
            get { return SimpleIoc.Default.GetInstance<TrafficLightReceiverViewModel>(); }
        }
    }
    
    公共级交通灯
    {
    公共字符串颜色{get;set;}
    公共时间范围持续时间{get;set;}
    }
    公共类LightEventArgs:EventArgs
    {
    公共照明事件args(交通灯)
    {
    _光=光;
    }
    公共交通灯{get{return\u Light;}
    }
    公共接口ITrafficLightService
    {
    无效信号灯(交通灯);
    公共事件事件处理程序TrafficLightSet;
    }
    公共交通服务
    {
    公共空间信号灯(交通灯)
    {
    Messenger.Default.Send(指示灯);
    }
    公共事件事件处理程序TrafficLightSet;
    }
    公共类交通灯发送服务模型
    {
    公共交通灯发送服务模型(ITrafficLightService交通灯服务)
    {
    _交通灯服务=交通灯服务;
    _发送(newtrafficlight{Color=“Red”});
    }
    }
    公共类交通LightReceiveViewModel
    {
    公共交通灯接收器视图模型(ITrafficLightService trafficLightService)
    {
    _交通灯服务=交通灯服务;
    _trafficLightService.TrafficLightSet+=TrafficLightNotification;
    }
    私有无效TrafficLightNotification(TrafficLightEventArgs args)
    {
    光照下的剂量(参数光);
    }
    }
    公共类ViewModelLocator
    {
    公共ViewModelLocator()
    {
    ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);
    if(ViewModelBase.IsIndesignatic)
    {
    SimpleIoc.Default.Register();
    }
    其他的
    {
    SimpleIoc.Default.Register();
    }
    SimpleIoc.Default.Register();
    SimpleIoc.Default.Register();
    }
    公共主视图模型发送器
    {
    获取{return SimpleIoc.Default.GetInstance();}
    }
    公共主视图模型接收器
    {
    获取{return SimpleIoc.Default.GetInstance();}
    }
    }
    
    这是一个更大、更复杂的例子

    让我们一步一步地完成此步骤:

  • 在MVVM环境下,我们使用ViewModelLocator完成两件事:1)注册所有ViewModel和服务
  • 提供一种允许视图在XAML中获取viewmodel的方法
  • 当我们尝试解析ViewModel时

    SimpleIoc.Default.GetInstance<TrafficLightReceiverViewModel>();
    
    SimpleIoc.Default.GetInstance();
    

    SimpleIoc查看viewmodel是否具有任何依赖项。在我们的例子中,我们需要为两个ViewModel提供iTraffClightService。所发生的事情是SimpleIoc查看它是否能够解析该类,并在此过程中检查ITrafficLightService是否也有任何需要解析的依赖项。如果SimpleIoc可以解析实例化viewmodel所需的依赖链,它会这样做,然后返回一个完整构建的对象。

    Wow没有想到依赖的方式会这么长吗?现在这是首选的方式?????我有很多问题,但在这个时候,我不能让你的代码编译,直到那时,我会等待的问题。我获取的类型“MvvmLight1.Model.LightEventArgs”不能用作泛型类型或方法“System.EventHandler”中的类型参数“TEventArgs”。没有从“MvvmLight1.Model.LightEventArgs”到“System.EventArgs”的隐式引用转换。LightEventArgs需要从EventArgs继承。DI是我首选的方法,因为它提供了许多好处:易于进行单元测试,它为我提供了一个可重用组件的集合,并且我没有隐藏类的任何依赖项。如果我正在快速地淘汰一个应用程序(实用程序/等等),我将使用方法1。对于未来的应用程序,我使用方法2,因为它更易于维护和测试。我会尝试一下,看看它是否有效。我只是感到惊讶,你需要使用事件,并认为这将更注入模型,而不是通过构造函数或其他什么。