0

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

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

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

  3. 通过参数传递数据。我看过一些教程,它们向您展示了如何为 windows phone 进行导航,但没有一个真正谈论参数传递。我猜这仍然是一个选择。

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

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

4

1 回答 1

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 中获取 viewmodel 的方法

当我们尝试解析 ViewModel

SimpleIoc.Default.GetInstance<TrafficLightReceiverViewModel>();

SimpleIoc 查看视图模型是否有任何依赖关系。在我们的例子中,我们需要一个 ITrafficLightService 用于我们的两个视图模型。发生的情况是 SimpleIoc 查看它是否可以解析该类,并在此过程中检查 ITrafficLightService 是否也有任何需要解析的依赖项。如果 SimpleIoc 可以解决实例化您的视图模型所需的依赖链,它会这样做,然后交还一个完全构建的对象。

于 2013-08-07T10:46:19.287 回答