如何防止 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}"
>
我正在尝试实现 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}"
>