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

时间:2014-07-04 09:15:38

标签: wpf mvvm

我有一个带有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; }
    }
}

1 个答案:

答案 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。