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

时间:2013-08-06 16:54:39

标签: windows-phone-7 mvvm mvvm-light

我对如何将数据传递给其他视图有点不清楚。我收集了有3种方法可以做到这一点,但我不知道如何做其中2个。

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

  2. 以某种方式通过新视图模型的构造函数传递数据。我说“某种程度上”,因为我不清楚在使用IOC容器时如何做到这一点(在这种情况下是内置的)。

  3. 通过参数传递数据。我看过几个教程,向您展示如何为Windows手机进行导航,但没有人真正谈论参数传递。我猜这仍然是一个选择。

  4. 据我所知,选项1是一种旧的方式。选项2似乎是一种更新的方式和更好的方法,但我找不到任何关于人们展示如何做的例子。

    我不知道怎么做,因为Ioc应该创建视图的实例,那么当数据不存在时如何将数据传入呢?

1 个答案:

答案 0 :(得分:2)

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

1)使用信使:

发件人类:

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

这里发生的是源对象使用Messenger作为事件代理。对象A不需要知道对象B,他们只需要知道信使。

2)

只需使用依赖注入:

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

这是一个更大的例子,也更复杂。

让我们一步一步地完成这个步骤:

  1. 在MVVM Light中,我们使用ViewModelLocator进行两件事:1)注册我们所有的视图模型和服务。
  2. 提供一种允许View在XAML中获取视图模型的方法
  3. 当我们尝试解析ViewModel

    SimpleIoc.Default.GetInstance<TrafficLightReceiverViewModel>();
    

    SimpleIoc查看viewmodel是否具有任何依赖项。在我们的情况下,我们需要一个ITrafficLightService用于我们的视图模型。会发生什么是SimpleIoc看到它是否可以解析该类,并在此过程中检查ITrafficLightService是否还有任何需要解析的依赖项。如果SimpleIoc可以解析实例化viewmodel所需的依赖链,那么它就会这样做,然后再移回一个完全构建的对象。