c# - 如何在不破坏 MVVM 的情况下导入我的 ViewModel?

标签 c# wpf mvvm prism mef

[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 服务,因此不会通过 MEF 自动加载。
  • 我的 ViewModel 层(适当的层)上的这段代码如何创建必要的 View 作为新窗口(主窗口的子窗口),然后将这个新的 OrderViewModel 链接为 DataContext?
  • 最佳答案

    避免“更新”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/

    相关文章:

    wpf - 绑定(bind) slider 控件的事件

    C# 将 SQL 数据绑定(bind)到 Listview WPF MVVM

    c# - 如何使用 string.Substring(char, char) 而不是 string.Substring(int, int)?

    c# - 在括号列表中查找括号对 ()

    c# - 通过 VB.NET 在 C# 中的集合

    c# - 通过 Internet 的 SQL 连接 : good practice?

    wpf - 初始焦点和全选行为

    c# - 在理解此示例代码方面需要帮助

    c# - 如何确定项目何时滚动到 View 中

    c# - 如何在 ASP.NET 5 DI 中配置嵌套依赖?