访问视图模型的静态属性为null

时间:2018-12-08 15:23:21

标签: c# wpf mvvm

在我的应用程序中,我需要从子设置视图模型中调用主视图模型中的方法,以更改主视图中的选项卡控件。基本上,它是选项卡控件中的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>

1 个答案:

答案 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);
                }));
        }
    }

显然,这不会将虚拟机的任何实例存储在字典中,而是每次都实例化。