在我的应用程序中,我需要从子设置视图模型中调用主视图模型中的方法,以更改主视图中的选项卡控件。基本上,它是选项卡控件中的viewsmodels列表。设置视图模型具有复选框以打开或关闭选项卡。
无论如何,我在实例的主viewmodel中设置了一个静态属性。在我的设置viewmodel构造函数中,我得到一个空响应,但是如果我在每个复选框属性更改上检索到实例,它将起作用。似乎是创建实例的时间问题。当主viewmodel实例不为null时,是否有事件或事件可以告诉我?
<Window.Resources>
<DataTemplate DataType="{x:Type skyTelescope:SkyTelescopeVM}">
<skyTelescope:SkyTelescopeV />
</DataTemplate>
<DataTemplate DataType="{x:Type rotator:RotatorVM}">
<rotator:RotatorView />
</DataTemplate>
<DataTemplate DataType="{x:Type focuser:FocuserVM}">
<focuser:FocuserView />
</DataTemplate>
<DataTemplate DataType="{x:Type settings:SettingsVM}">
<settings:SettingsV />
</DataTemplate>
</Window.Resources>
答案 0 :(得分:1)
使用wpf需要学习很多东西,并且mvvm方法与事件驱动代码有很大不同。
您的标记看起来像是您首先在进行viewmodel…之类。 如果您有MainWindowViewModel,请说说SubVM属性。
将SubVM绑定到主窗口中contentcontrol的content属性。 将SubVM设置为视图模型的实例,例如SettingsVM。 然后使用匹配的数据模板在视图中将其模板化。 您会看到一个SettingsV。 SettingsV的数据上下文是您的SubVM。 将SettingsV中的控件绑定到SubVM中的属性,值可以在它们之间传递。 这使您可以控制何时在MainWindowViewModel中实例化SettingsVM。 因此,您“知道”您是否具有它的实例。 您可以将视图模型的实例缓存在字典中。 使用一种类型作为密钥,如果您的字典中没有该类型,则可以实例化它,然后如果您想保留状态,则可以重新使用它。
您可以通过在xaml中定义它的数据上下文来使MainWindow实例化MainWindowViewModel。
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
首先使用viewmodel,模板的工作方式有些奇怪。如果要重置(未绑定)视图状态,则需要通过先将SubVM属性设置为null来强制重新模板化。 此命令将类型作为参数
private RelayCommand<Type> navigateCommand;
public RelayCommand<Type> NavigateCommand
{
get
{
return navigateCommand
?? (navigateCommand = new RelayCommand<Type>(
vmType =>
{
CurrentViewModel = null;
CurrentViewModel = Activator.CreateInstance(vmType);
}));
}
}
显然,这不会将虚拟机的任何实例存储在字典中,而是每次都实例化。