如何防止 ViewModel 构造函数被调用两次?

How to prevent a ViewModel constructor from being called twice?

我正在尝试实现 MVVM 模式并且在 App.xaml 中已经有了 DataTemplates 并将 ViewModel 绑定为 DataContext。

App.xaml:

<DataTemplate DataType="{x:Type Models:InputViewModel}">
    <Views:InputView/>
</DataTemplate>

用户控件:

<UserControl.DataContext>
    <Models:InputViewModel/>
</UserControl.DataContext>

现在,当我想通过命令显示一个新视图时,我将一个新实例分配给 ViewModel 属性,该类型是一个扩展所有 ViewModel 的抽象基础 class .

public ICommand DisplayInputView
{
    get
    {
        return new DelegateCommand(action => ViewModel = new InputViewModel());
    }
}

这会导致 ViewModel 的构造函数被调用两次,一次由命令调用,一次由视图的构造函数调用。因此,我想通过命令传递到下一个视图模型的参数没有被考虑在内。

public ICommand DisplayInputView
{
    get
    {
        return new DelegateCommand(Input);
    }
}

void Input(object control)
{
    ViewModel = new InputViewModel();
    InputViewModel.AuditControl = control as AuditControl ?? new AuditControl();
}

如何定义DataTemplate 和Datacontex 以便视图模型的构造函数只执行一次并且我可以通过命令传递参数?

从标记中删除 <UserControl.DataContext> 分配。 DataContext 将从绑定到 ViewModel 属性 的控件继承,因此您无需再次设置它。

如果您想要 design-time 绑定,请使用 a design-time data context:

<UserControl
    ...
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:vm="clr-namespace:YourLocalNamespace"
    d:DataContext="{d:DesignInstance vm:InputViewModel}"
>