ログインビューモデルを使用したログインビューがあり、気が狂うような問題に遭遇しました。MVVM Light を使用していることに注意してください。
ビューモデルには、ビューモデルの状態に応じてビュー内の要素を非表示にする 3 つの可視性プロパティがあります。
私のプロパティは次のようになり、すべてが PropertyChangedEvent をトリガーします。
public Visibility ErrorPanelVisibility
public Visibility LoginPanelVisibility
public Visibility LoadingPanelVisibility
バインディングは次のようになります (マージンなどを省略):
<Border Visibility="{Binding ErrorPanelVisibility}">
<StackPanel Visibility="{Binding LoginPanelVisibility}">
<StackPanel Visibility="{Binding LoadingPanelVisibility}">
ユーザーがログイン ボタンを押すと、ビューモデルでこのメソッドを実行するコマンドによって可視性が変更されます。
private void ExecuteLogin()
{
ErrorPanelVisibility = Visibility.Collapsed;
LoginPanelVisibility = Visibility.Collapsed;
LoadingPanelVisibility = Visibility.Visible;
// This method takes a few seconds to complete.
Login(errorMessage =>
{
if (!String.IsNullOrEmpty(errorMessage))
{
ErrorMessage = errorMessage;
ErrorPanelVisibility = Visibility.Visible;
LoginPanelVisibility = Visibility.Visible;
LoadingPanelVisibility = Visibility.Collapsed;
}
else
{
DialogResult = true;
}
});
}
問題は、パネルが折りたたまれていないか、ビューに表示されるように変更されておらず、変更がビューに反映されていないことです。可視性を Visible に設定し、Collapsed に設定しないと、PropertyChangedEvent が発生し、ErrorPanel が機能します。
編集:ログイン方法:
private void Login(Action<string> callback)
{
string errorMessage = string.Empty;
if (SelectedServer == null)
{
errorMessage = "Select server."; //TODO: Translate
}
else if (String.IsNullOrEmpty(Username) || String.IsNullOrEmpty(Password))
{
errorMessage = Resources.WrongUsernameOrPassword;
}
else
{
try
{
// Changed name due to customer information
IWCFClient wcfClient = WCFClient.GetInstance();
LoginObj loginObj = wcfClient.Login(Username, Password);
// Removed some cases to simplify, they all set the errorMessage.
switch (loginObj.LoginStatus)
{
case LoginObj.LoginState.AlreadyLogedin:
errorMessage = Resources.UserAlreadyLoggedOn;
break;
default:
errorMessage = Resources.ErrorOccurred;
break;
}
}
catch (Exception e)
{
errorMessage = e.Message;
}
}
callback(errorMessage);
}
ただし、コードを次のように変更すると、パネルは機能します。
bool login = false;
private void ExecuteLogin()
{
if (login)
{
ErrorPanelVisibility = Visibility.Collapsed;
LoginPanelVisibility = Visibility.Collapsed;
LoadingPanelVisibility = Visibility.Visible;
}
else
{
ErrorPanelVisibility = Visibility.Visible;
LoginPanelVisibility = Visibility.Visible;
LoadingPanelVisibility = Visibility.Collapsed;
}
login = !login;
}
ここで明らかな間違いがありますか、それとも私が間違っていることを誰かが見つけることができますか?