2

我在这里尝试在我的问题表单上实现提前:将参数从视图模型发送到另一个视图模型的构造函数

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

我的视图模型如下所示:

登录视图模型:

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;
}

信使视图模型:

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

    public class MessengerViewModel : Screen,IMessengerViewModel
    {
    }

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

外壳视图模型:

 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 中处理。

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

4

1 回答 1

0

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

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

(我省略了你的一些代码)。接下来,确保您ExportConcreteFactory(并再次重命名)。我们强制工厂方法采用您的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 使用该构造函数并注入适当的类型。

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

于 2010-12-16T18:28:21.720 回答