Связывание стековой панели, доступной для свойства, не работает - PullRequest
0 голосов
/ 26 сентября 2018

У меня в главном окне есть панель стека под названием Panel.Свойство панели IsEnabled привязано к свойству IsLoggedIn в viewModel.Цель всего приложения - это приложение магазина.Пользователь должен открыть приложение и не входить в систему, затем он может нажать кнопку и ввести некоторую информацию для входа в систему, а затем нажать кнопку FinishLogin, при этом для IsLoggedIn будет установлено значение true.Когда это происходит, Panel, которая изначально была установлена ​​IsEnabled = false, должна изменить IsEnabled = true для Panel, чтобы пользователь мог взаимодействовать с Panel.Такого не бывает.Пользователь может войти в систему, и при отладке я вижу, что IsLoggedIn изменяется на true, как и положено.Если я установлю IsEnabled = true в явном виде, как показано ниже в свойстве, то я также могу видеть, что IsEnabled становится истинным.Но когда пользователь нажимает кнопку для входа, панель не становится активной, как это должно быть.Код для панели приведен ниже:

<StackPanel Name="Panel" IsEnabled="{Binding IsLoggedIn}">

Это связано с:

        public bool IsLoggedIn
    {
        get => this._isLoggedIn;
        set
        {
            if (this._isLoggedIn != value)
            {
                this._isLoggedIn = value;
                OnPropertyChanged("IsLoggedIn");
            }
        }
    } 

Когда IsLoggedIn меняется на true, я хочу, чтобы элемент IsEnabled панели становился true.INotifyPropertyChanged фиксирует изменение, потому что, когда я отлаживаю, оно не равно нулю, но когда IsLoggedIn становится истинным, в пользовательском интерфейсе ничего не меняется.Я попробовал это:

        public bool IsLoggedIn
    {
        get => this._isLoggedIn;
        set
        {
            if (this._isLoggedIn != value)
            {
                this._isLoggedIn = value;
                OnPropertyChanged("IsLoggedIn");
                if(this._isLoggedIn == true) 
                  {
                    MainWindow mainWindow = new MainWindow();
                    mainWindow.Panel.IsEnabled = true;
                    OnPropertyChanged("IsLoggedIn");
                  }
            }
        }
    }

У меня установлен такой текстовый текст данных:

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

IsLoggedIn находится в классе MainWindowViewModel.

Здесь определен метод INotifyPropertyChanged:

 public void OnPropertyChanged(string propertyName)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

Команда button вызывает этот метод, который должен установить IsLoggedIn в значение true.Это ниже:

public void LoginChecks()
    {
        LoginPage loginPage = new LoginPage();
        if ((usernameList.Contains(EnteredUsername) &&
           passwordList.Contains(EnteredPassword)) &&
           (usernameList.IndexOf(EnteredUsername) ==
           (passwordList.IndexOf(EnteredPassword))))
        {
            IsLoggedIn = true;
            CloseAction();
        }
    }

CloseAction является обычным {get;set;} свойство, определенное в viewModel.Это делает следующее в окне LoginPage.Он просто закрывает окно входа в систему.Этот код находится в коде окна LoginPage, потому что я не знал, как еще закрыть окно:

if(viewModel.CloseAction == null)
            viewModel.CloseAction = new Action(this.Close);

Но это тоже не работает.Любая помощь будет принята с благодарностью.

...