Wpf 使用参数调用视图构造函数
我有一个WPF项目,使用MVVM模式 在代码隐藏中,我将视图称为:Wpf 使用参数调用视图构造函数,wpf,mvvm,Wpf,Mvvm,我有一个WPF项目,使用MVVM模式 在代码隐藏中,我将视图称为: NavigateToViewCommand command = new NavigateToViewCommand(Container.Container.GetA<IProductViewModel>()); command.Execute(); NavigateToViewCommand如下所示: public class NavigateToViewCommand : WpfCommand { pri
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;
}
}
以下是IPProductViewModel界面:
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; }
}
}
查看上面评论中提到的CodeProject文章,您似乎使用了VM优先的方法:您使用IoC容器来获取VM的实例,但视图是数据模板。当您导航到一个特定的VM时,WPF框架使用相关的datat模板,因此查看VM类型,因此您不太可能钩住视图的创建过程。即使可以,将int传递给ctr也可能是不明智的,尤其是在依赖项注入环境中 相反,您可以将int作为VM上的属性公开,然后访问视图代码中的值,如下所示:-
// Assumes the int property is called ProductId
var productId = (DataContext as IProductViewModel).ProductId;
您可能会发现在视图的构造函数中无法执行此操作,因为只有在调用ctr之后才会分配DataContext。在第一个代码段中,您会得到IPProductViewModel的实例,这可能是您要导航到的视图模型。是否要调用此IPProductViewModel实例的重载构造函数int?@AndrewStephens是的,IPProductViewModel是我要用于所需视图的视图模型。我想调用ProductView的重载构造函数,而不是视图模型。您的代码显示了如何获取VM实例,但其关联视图是如何实例化的?我注意到您在命令代码中调用了IMainViewModel的NavigateToView方法。它在那里吗?@AndrewStephens NavigateToView方法在MainViewModel类中,它扩展了ViewModelBase类并实现了IMainViewModel接口。@AndrewStephens我是这样实现它的: