我对如何将数据传递给其他视图有点不清楚。我收集了有3种方法可以做到这一点,但我不知道如何做其中2个。
通过信使发送数据(不确定是否可以发送对象,否则如果您必须发送10条数据或类似的内容,我会发现事情变得非常混乱)。
以某种方式通过新视图模型的构造函数传递数据。我说“某种程度上”,因为我不清楚在使用IOC容器时如何做到这一点(在这种情况下是内置的)。
通过参数传递数据。我看过几个教程,向您展示如何为Windows手机进行导航,但没有人真正谈论参数传递。我猜这仍然是一个选择。
据我所知,选项1是一种旧的方式。选项2似乎是一种更新的方式和更好的方法,但我找不到任何关于人们展示如何做的例子。
我不知道怎么做,因为Ioc应该创建视图的实例,那么当数据不存在时如何将数据传入呢?
答案 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>(); }
}
}
这是一个更大的例子,也更复杂。
让我们一步一步地完成这个步骤:
当我们尝试解析ViewModel
时SimpleIoc.Default.GetInstance<TrafficLightReceiverViewModel>();
SimpleIoc查看viewmodel是否具有任何依赖项。在我们的情况下,我们需要一个ITrafficLightService用于我们的视图模型。会发生什么是SimpleIoc看到它是否可以解析该类,并在此过程中检查ITrafficLightService是否还有任何需要解析的依赖项。如果SimpleIoc可以解析实例化viewmodel所需的依赖链,那么它就会这样做,然后再移回一个完全构建的对象。