我有一个带有MVVM模式的WPF项目。
在后面的代码中,我调用了一个视图:
NavigateToViewCommand command = new NavigateToViewCommand(Container.Container.GetA<IProductViewModel>());
command.Execute();
NavigateToViewCommand如下所示:
public class NavigateToViewCommand : WpfCommand
{
private readonly object _viewToNavigate;
public NavigateToViewCommand(object viewToNavigate) : base("Navigate")
{
_viewToNavigate = viewToNavigate;
}
protected override void RunCommand(object parameter)
{
Container.Container.GetA<IMainViewModel>().NavigateToView(_viewToNavigate);
}
protected override IEnumerable<string> GetPreconditions(object parameter)
{
yield break;
}
}
这是IProductViewModel界面:
public interface IProductViewModel : IViewModelBase
{
string Name { get; }
IEnumerable<string> Products { get; }
}
IViewModelBase是空接口,它实现了INotifyPropertyChanged接口。 IMainViewModel实现了IViewModelBase接口。
在我看来,我有一个没有参数的构造函数,以及带参数int的构造函数。我想用参数调用构造函数。我该怎么做?
这是我的WPFCommand类:
public abstract class WpfCommand : ICommand
{
private readonly string _verb;
protected WpfCommand(string verb)
{
_verb = verb;
}
public string Verb
{
get { return _verb; }
}
public void Execute(object parameter)
{
RunCommand(parameter);
}
protected abstract void RunCommand(object parameter);
protected abstract IEnumerable<string> GetPreconditions(object parameter);
public bool CanExecute(object parameter)
{
return GetPreconditions(parameter).Count() < 1;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}
答案 0 :(得分:0)
查看上述评论中提到的CodeProject文章,您似乎使用了VM优先方法:使用IoC容器来获取VM的实例,但视图是数据模板。当您导航到特定VM时,WPF框架使用相关的数据集合(因此视图)用于VM类型,因此您不太可能挂钩到视图的创建过程。即使你可以,将int
传递给ctr也许是不明智的,特别是在依赖注入环境中。
相反,您可以将int
公开为VM上的属性,然后像这样访问视图代码隐藏中的值: -
// Assumes the int property is called ProductId
var productId = (DataContext as IProductViewModel).ProductId;
您可能会发现在视图的构造函数中无法执行此操作,因为直到调用ctr之后才会分配DataContext。