Rya*_*ies 2 c# wpf mvvm mvvm-light
我正在使用MVVM Light,我目前正在使用该软件包附带的SimpleIoC.我对依赖注入有点困惑.我想在视图模型中使用一堆服务,但是大多数窗口都是List-Edit范例,即一个屏幕列出所有类型Person,然后您可以Person通过新屏幕添加或编辑a .
当我在我的代码后面的代码中进行所有代码添加和编辑记录时如下:
视图
private void btnEdit_Click(object sender, RoutedEventArgs e)
{
    _viewModel.Edit();
}
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
    _viewModel.Add();
}
查看模型
public void Add()
{
    var f = new TypeDetails();
    f.Show();
}
public void Edit()
{
   if (SelectedItem == null)
      return;
   var f = new TypeDetails(SelectedItem.Id);
   f.Show();
}
构造函数TypeDetails如下:
public TypeDetails(int id = 0)
{
    InitializeComponent();
    _viewModel = new TypeDetailsViewModel(id);
    DataContext = _viewModel;
}
使用MVVM Light实现此类型功能最好的是什么?我一直在使用ViewModelLocatorList屏幕的类,但是我看不到使用SimpleIoC的方法.到目前为止,我的方法是保持构造函数相同,这工作正常,直到我需要将依赖项注入到TypeDetailsViewModel服务中.使用服务的构造函数TypeDetailsViewModel将是:
public TypeDetailsViewModel(ISomeService someService, int id = 0)
{
     ...
}
但这意味着在我的视图构造函数中,我必须一次构建这些依赖项并手动注入它们......
public TypeDetails(int id = 0)
{
    InitializeComponent();
    _viewModel = new TypeDetailsViewModel(SimpleIoC.Current.GetInstance<ISomeService>(),id);
    DataContext = _viewModel;
}
有一个更好的方法吗?
首先,我将查看"RelayCommand"类,它是MVVM Light的一部分.它将消除代码背后事件的需要.从那开始.
你应该总是喜欢"构造函数注入"而不是ServiceLocator(例如:SimpleIoC.Current.GetInstance())
您的ViewModel构造函数应该只注入服务而不是像"int"这样的基本类型.在您的示例中,"int id"应该是方法的参数而不是注入.
例如:您的TypeDetailsViewModel看起来应该更像:
public TypeDetailsViewModel(ISomeService someService)
{
     TypeDetail GetDetailsCommand(int id)
     {
        ...
     }
}
最后,您的模型永远不应该对您的ViewModel有任何引用.
对于DataContext,您可以使用ViewModelLocator(ViewModelLocator中的ViewModel MVVM Light)
要连接View和ViewModel以使用GetDetailsCommand,可以使用EventToCommand行为(http://msdn.microsoft.com/en-us/magazine/dn237302.aspx).例如:View上的OnLoaded事件调用ViewModel上的GetDetailsCommand.