我在我的问题表单上尝试实现提前:send parameter from view-model to constructor of another view-model。
我有一个shell视图模型和2个视图模型。我需要将对象从一个视图模型传递给另一个视图模型(构造函数。)
我的观点模型如下:
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
{
}
在shell-view模型中,我尝试为视图模型创建抽象工厂。
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的import属性导入到另一个视图中。因此,最好使用事件agrregator。但我不知道如何在我的问题中使用这个类。
我认为,从shell-view-model发布方法并在logon-view-model中处理。
但我认为我现在所做的一切都很糟糕。
答案 0 :(得分:0)
您需要稍微调整一下代码。首先,我认为最好将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使用该构造函数并注入适当的类型。
希望指出你正确的方向?