[Export]
public sealed class MainViewModel : NotificationObject
{
[Import]
public ISomeService MyService { get; private set; }
...
}
为了将此类作为 DataContext 注入(inject)到我的 View 中,我必须将其标记为导出,以便 MEF 在目录中创建它的实例。问题是主窗口需要创建其他窗口并传递命令,我不确定如何在不破坏 MVVM 方法的情况下进行。
我认为
ICommand
将触发我的 MainViewModel 上的某些内容以生成新的 ViewModel,但是在那之后我不能真正强制从 ViewModel 打开一个新的窗口( View )。另外,我什至不能真正从我的 MainViewModel 创建一个新的 ViewModel,因为这样 MEF 就不会真正工作,对吧?[Export]
public sealed class MainViewModel : NotificationObject
{
[Import]
public ISomeService MyService { get; private set; }
private ObservableCollection<IOrderViewModel> Orders { get; set; }
public void OpenOrder(int id)
{
//Pseudo-code to ensure that duplicate orders are not opened)
//Else create/open the new order
var order = new OrderViewModel(id);
OpenOrders.Add(order);
}
}
这里有2个问题:
最佳答案
避免“更新”OrderViewModel
的方法是使用工厂:
[Export]
public class OrderViewModelFactory
{
[Import]
public ISomeDependency ImportedDependency { get; set; }
public OrderViewModel Create(int id)
{
return new OrderViewModel(id, this.ImportedDependency);
}
}
然后将工厂导入您的
MainViewModel
作为依赖项,MEF 将根据需要填写所有内容。为了解决实例化窗口的问题,我们创建了一个
DialogService
做类似的事情:[Export]
public class DialogService
{
public bool? ShowDialog(string regionName, object data = null)
{
var window = new Window();
var presenter = new ContentControl();
presenter.SetProperty(RegionManager.RegionName, regionName);
window.Content = presenter;
if (data != null) window.DataContext = data;
return window.ShowDialog();
}
}
关于c# - 如何在不破坏 MVVM 的情况下导入我的 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7713508/