Senden Sie Parameter vom Ansichtsmodell an einen anderen Ansichtsmodell Vol.2 an den Konstruktor

StackOverflow https://stackoverflow.com/questions/4462417

Frage

Ich versuche hier vorab in meinem Fragenformular zu implementieren: Senden Sie den Parameter vom Ansichtsmodell an einen anderen Ansichtsmodell an den Konstruktor.

Ich habe ein Shell-View-Modell und 2 View-Model. Ich muss Objekt von einem Ansichtsmodell an ein anderes Ansichtsmodell (Konstruktor) passieren.

Meine Ansichtsmodelle sehen so aus:

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

Im Shell-View-Modell versuche ich, abstrakte Werksfabrik für View-Modelle zu machen.

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

Mein Problem ist: Wie kann ich die Methode von Shell-View-Model in LogonViemodel aufrufen? Ich erhalte Fortschritt, das schlecht verwendet wird und das IOC-Attribut für Inport-Shell-View-Modell in eine andere Ansicht importiert. Soldely ist eine bessere Nutzung des Ereignisses Agregator dazu. Aber ich weiß nicht, wie diese Klasse in meinem Problem verwendet wird.

Ich denke, veröffentlichen Sie die Methode aus Shell-View-Model und verarbeiten Sie sie in Logon-View-Modell.

Aber ich denke, dass alles, was ich jetzt tue, schlecht ist.

War es hilfreich?

Lösung

Sie müssen Ihren Code geringfügig einstellen. Zu Beginn denke ich, dass es am besten ist, Ihre Implementierung von zu entkoppeln IFactory (und benennen es es in etwas weniger generisches um), zB:

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

(Ich habe einige Ihrer Code weggelassen). Als nächstes stellen Sie sicher, dass Sie Sie Export dein ConcreteFactory (und wieder umbenennen). Wir zwingen die Fabrikmethode, eine Instanz von Ihnen zu nehmen IShellViewModel Vertrag.

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

Und passen Sie Ihre an LogOnViewModel in diese Instanz aufnehmen IShellViewModel starb aus der Fabrik.

public class LogOnViewModel : ILogOnViewModel
{
  private readonly IShellViewModel _shellViewModel;

  public LogOnViewModel(IShellViewModel shellViewModel)
  {
    _shellViewModel = shellViewModel;
  }

  public void SomeOperation()
  {
    // Do work with _shellViewModel;
  }
}

Als nächstes werden wir die ändern ShellViewModel Um es konstruiert zu werden und eine Abhängigkeit für die Fabrik injiziert zu werden, wird es konsumieren:

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

Das ImportingConstructor Weisen Sie MEF an, diesen Konstruktor zu verwenden und die entsprechenden Typen zu injizieren.

Hoffe das zeigt dich in die richtige Richtung?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top