Инициализированный объект становится нулевым в viewModel после нажатия кнопки - PullRequest
0 голосов
/ 12 марта 2019

Я столкнулся с проблемой, из-за которой объект, инициализированный с помощью IoC ( CastleWindsor ) в MainViewModel , становится пустым, как только я нажимаю кнопку в форме WPF.

У меня есть этот код в MainWindow.xaml.cs

var iocContainer = WindContainer.WindsorContainer;//This is IoCcontainer and working okay
  iocContainer.Install(new IoCInstaller());

 var mainWindowViewModel = iocContainer.Resolve<MainWindowViewModel>("MainWindowViewModel");
 mainWindowViewModel.Initialize(iocContainer);
 DataContext = mainWindowViewModel;

и метод Initialize () в MainWindowViewModel выглядит следующим образом:

public void Initialize(WindsorContainer windsorContainer)
        {
            Logger.Debug("Initializing main view model");
            iocContainer = windsorContainer;
            myManager = iocContainer.Resolve<IMyManager>("MyManager");
            _dataManager = iocContainer.Resolve<IDataManager>("DataManager");
            _dataManager.Initialize();
         }

Все работает нормально, но когда я нажимаю кнопку и выполняю команду в этот момент, iocContainer, _dataManager и myManager становятся равными нулю. Следующий код также находится в MainWindowViewModel.

private ICommand _clickCommandForBttnA;
        public ICommand ClickCommandForBttnA
        {
            get
            {
                return _clickCommandForBttnA ?? (_clickCommandForBttnA = new CommandHandlerForBttnA(() => MyActionForBttnA(), _canExecute));
            }
        }

        public void MyActionForBttnA()
        {
            Logger.Debug("Option A is clicked");
            if (_dataManager.SomeData.Equals("myData"))//Here _dataManager is null after clicking button
            {
                BackgroundColorBttnA = Colors.Blue;
                BackgroundColorBttnB = _allButtonInitialColor;
                BackgroundColorBttnC = _allButtonInitialColor;
                BackgroundColorBttnD = _allButtonInitialColor;
                BackgroundColorBttnConfirm = _allButtonInitialColor;
            }
        }

Командный обработчик для кнопки

public class CommandHandlerForBttnA : ICommand
    {
        private Action _action;
        private bool _canExecute;
        public CommandHandlerForBttnA(Action action, bool canExecute)
        {
            _action = action;
            _canExecute = canExecute;
        }

        public bool CanExecute(object parameter)
        {
            return _canExecute;
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            _action();
        }
    }

Есть причина / предложение, почему это происходит?

1 Ответ

1 голос
/ 13 марта 2019

Я не знаком с библиотекой CastleWindsor, но, возможно, мои сомнения приведут вас к решению.

Я не знаю и не могу найти в документации CastleWindsor о:

var iocContainer = WindContainer.WindsorContainer;//This is IoCcontainer and working okay

Это ваш код?Может быть, что-то существенное скрыто здесь?У меня есть опасение, что контейнер может быть удален вовремя, когда вы нажмете кнопку.

Кстати - вы используете DI странным образом.На мой взгляд, вы не должны передавать контейнер для просмотра модели.Модель представления должна иметь конструктор со всеми зависимостями в качестве параметров.Затем, когда вы регистрируете зависимости в контейнере IoC и затем вызываете Resolve для модели представления, контейнер разрешает объект со всеми зависимостями.

...