Wpf 使用参数调用视图构造函数

Wpf 使用参数调用视图构造函数,wpf,mvvm,Wpf,Mvvm,我有一个WPF项目,使用MVVM模式 在代码隐藏中,我将视图称为: NavigateToViewCommand command = new NavigateToViewCommand(Container.Container.GetA<IProductViewModel>()); command.Execute(); NavigateToViewCommand如下所示: public class NavigateToViewCommand : WpfCommand { pri

我有一个WPF项目,使用MVVM模式

在代码隐藏中,我将视图称为:

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我是这样实现它的: