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上进行导航,但没有一个真正谈到参数传递。我猜这仍然是一种选择 据我所
我不知道怎么做,因为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();}
}
}
这是一个更大、更复杂的例子
让我们一步一步地完成此步骤:
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,因为它更易于维护和测试。我会尝试一下,看看它是否有效。我只是感到惊讶,你需要使用事件,并认为这将更注入模型,而不是通过构造函数或其他什么。