【问题标题】:send parameter from view-model to constructor of another view-model vol.2将参数从视图模型发送到另一个视图模型 vol.2 的构造函数
【发布时间】:2011-05-26 15:12:15
【问题描述】:

我在这里尝试在我的问题表单上实现提前:send parameter from view-model to constructor of another view-model

我有一个外壳视图模型和两个视图模型。我需要将对象从一个视图模型传递到另一个视图模型(构造函数)。

我的视图模型如下所示:

LogOnViewModel:

public interface ILogOnViewModel : IScreen, IDataErrorInfo
{
    string Nick { get; set; }
    string Password { get; set; }
    bool CanLogOn { get; set; }
    void LogOn(string nick, string password);
}


public class LogOnViewModel : Screen,ILogOnViewModel
{

    //[Import]
    //private IShellViewModel _shellViewModel;
}

MessangerViewModel:

 public interface  IMessengerViewModel:IScreen
    {
        BitmapImage AvatarImage { get; set; }
        string AvatarStatus { get; set; }
        KeyValuePair<string, Friend> SelectedFriend { get; set; }
    }

    public class MessengerViewModel : Screen,IMessengerViewModel
    {
    }

在外壳视图模型中,我尝试为视图模型创建抽象工厂。

ShellViewModel:

 public interface IFactory
    {
        ILogOnViewModel CreateLogOnViewModel();
        IMessengerViewModel CreateMessengerViewModel();
    }

    public class ConcreteFactory : IFactory
    {
        #region Implementation of IFactory

        public ILogOnViewModel CreateLogOnViewModel()
        {
            return new LogOnViewModel();
        }

        public IMessengerViewModel CreateMessengerViewModel()
        {
            return new MessengerViewModel();
        }

        #endregion
    }


    public interface IShellViewModel
    {
        void ShowLogOnView();
        void ShowMessengerView();
    }

    [Export(typeof(IShellViewModel))]
    public class ShellViewModel : Conductor<IScreen>, IShellViewModel
    {
        private ConcreteFactory _factory;

        public ShellViewModel()
        {
            _factory=new ConcreteFactory();
            ShowLogOnView();
        }

        public void ShowLogOnView()
        {
            ActivateItem(_factory.CreateLogOnViewModel());
            //ActivateItem(IoC.Get<LogOnViewModel>());
        }

        public void ShowMessengerView()
        {
            ActivateItem(_factory.CreateMessengerViewModel());
            //ActivateItem(IoC.Get<MessengerViewModel>());
        }
    }

我的问题是:如何从 LogOnVieModel 中的 Shell-view-model 调用方法。我得到了不好的使用 IoC 并将 inport shell-view-model 上的属性导入另一个视图。 Supposudely 最好在此使用事件聚合器。但我不知道如何在我的问题中使用这个类。

我认为,从 shell-view-model 发布方法并在 logon-view-model 中处理。

但我认为我现在所做的一切都很糟糕。

【问题讨论】:

    标签: wpf ioc-container mef caliburn.micro


    【解决方案1】:

    您需要稍微调整您的代码。首先,我认为最好将IFactory 的实现解耦(并将其重命名为不太通用的名称),例如:

    public interface IViewModelFactory
    {
      ILogOnViewModel CreateLogOnViewModel(IShellViewModel shellViewModel);
    }
    

    (我省略了你的一些代码)。接下来,确保您 Export 您的 ConcreteFactory(再次重命名)。我们强制工厂方法获取您的 IShellViewModel 合约的实例。

    [Export(typeof(IViewModelFactory))]
    public class DefaultViewModelFactory : IViewModelFactory
    {
      public ILogOnViewModel CreateLogOnViewModel(IShellViewModel shellViewModel)
      {
        return new LogOnViewModel(shellViewModel);
      }
    }
    

    并调整您的 LogOnViewModel 以接收从工厂传递的 IShellViewModel 实例。

    public class LogOnViewModel : ILogOnViewModel
    {
      private readonly IShellViewModel _shellViewModel;
    
      public LogOnViewModel(IShellViewModel shellViewModel)
      {
        _shellViewModel = shellViewModel;
      }
    
      public void SomeOperation()
      {
        // Do work with _shellViewModel;
      }
    }
    

    接下来,我们将更改 ShellViewModel 以构造它并为它将使用的工厂注入依赖项:

    [Export(typeof(IShellViewModel))]
    public class ShellViewModel : Conductor<IScreen>, IShellViewModel
    {
      private readonly IViewModelFactory _factory;
    
      [ImportingConstructor]
      public ShellViewModel(IViewModelFactory factory)
      {
        _factory = factory;
      }
    
      public void ShowLogOnView()
      {
        var model = _factory.CreateLogOnViewModel(this);
        ActivateItem(model);
      }
    }
    

    ImportingConstructor 指示 MEF 使用该构造函数并注入适当的类型。

    希望这能为您指明正确的方向吗?

    【讨论】:

    • 非常感谢,它看起来又好又聪明。我是 wpf、mvvm 的初学者,所以有时我很困惑和无助。
    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多