将stackpanel绑定到属性不起作用

时间:2018-09-26 12:52:04

标签: c# wpf binding inotifypropertychanged isenabled

我在主窗口中有一个名为Panel的堆栈面板。 Panel的IsEnabled属性绑定到viewModel中的IsLoggedIn属性。整个应用程序的目的在于它是一个商店应用程序。用户应打开应用程序且不登录,然后他们可以单击一个按钮并输入一些登录信息,然后单击FinishLogin按钮,这样做会将IsLoggedIn设置为true。发生这种情况时,最初设置为IsEnabled = false的Panel应该更改Panel的IsEnabled = true,以便用户能够与Panel进行交互。这不会发生。用户能够登录,并且在调试时我可以看到IsLoggedIn像应有的那样更改为true。如果我像下面在属性中一样显式设置IsEnabled = true,那么我还可以看到IsEnabled变为true。但是,当用户单击按钮登录时,该面板不会像预期的那样启用。该面板的代码如下:

<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捕获更改,因为当我调试它不为null时,但是当IsLoggedIn变为true时,UI中没有任何更改。我尝试过:

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

按钮命令调用此方法,该方法应将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窗口中执行以下操作。它只是关闭LoginWindow。这段代码位于LoginPage窗口后面的代码中,因为我不知道如何关闭该窗口:

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

但这也不起作用。任何帮助将不胜感激。

0 个答案:

没有答案