我在主窗口中有一个名为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);
但这也不起作用。任何帮助将不胜感激。