Доступ к статическому свойству модели представления является нулевым - PullRequest
0 голосов
/ 08 декабря 2018

в моем приложении мне нужно вызвать метод в моей модели основного вида из модели представления дополнительных настроек, чтобы изменить элемент управления вкладкой в ​​главном представлении.В основном это список моделей представления в элементе управления вкладки.В настройках viewmodel есть флажки для включения или выключения вкладок.

В любом случае, я устанавливаю статическое свойство в основной модели представления экземпляра.В моих настройках конструктора viewmodel я получаю нулевой ответ, но если я получаю экземпляр при каждом изменении свойства флажка, он работает.Похоже на проблему времени при создании экземпляров.Есть ли событие или что-то, что может сказать мне, когда основной экземпляр viewmodel не нулевой?

 <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 голосов
/ 08 декабря 2018

С wpf можно многому научиться, и подход mvvm сильно отличается от кода, управляемого событиями.

Ваша разметка выглядит так, будто вы сначала делаете viewmodel ... или что-то в этом роде.Если у вас есть экспозиции MainWindowViewModel, скажем, свойство SubVM.

Привязать SubVM к свойству содержимого элемента управления контентом в главном окне.Установите SubVM для экземпляра модели представления, такой как SettingsVM.Затем это оформляется на виде с использованием соответствующей таблицы данных.Вы видите Настройки V появляются.Текст данных Настройки V - это ваш SubVM.Свяжите элементы управления в SettingsV со свойствами в SubVM, и значения могут передаваться между ними.Это позволяет вам контролировать, когда вы создаете экземпляр SettingsVM в MainWindowViewModel.Поэтому вы «знаете», есть ли у вас экземпляр этого или нет.Вы можете кэшировать экземпляры моделей представления в словаре.Используйте тип в качестве ключа, и вы можете создать его, если у вас его нет в словаре, а затем использовать его повторно, если вы хотите сохранить состояние.

Вы можете настроить MainWindow для создания экземпляра MainWindowViewModel, определив его datacontextв xaml.

  <Window.DataContext>
      <local:MainWindowViewModel/>
  </Window.DataContext>

Сначала в viewmodel есть странность способа работы шаблонов.Если вы хотите сбросить (несвязанное) состояние просмотра, то вам нужно принудительно повторно шаблонизировать, сначала установив для свойства SubVM значение null.Эта команда принимает Type в качестве параметра

    private RelayCommand<Type> navigateCommand;
    public RelayCommand<Type> NavigateCommand
    {
        get
        {
            return navigateCommand
              ?? (navigateCommand = new RelayCommand<Type>(
                vmType =>
                {
                    CurrentViewModel = null;
                    CurrentViewModel = Activator.CreateInstance(vmType);
                }));
        }
    }

Очевидно, что это не спрятало ни одного экземпляра vm в словаре, оно просто создает каждый раз экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...