RelayCommand <PasswordBox> CanExecute никогда не запускается в хранилище Windows 8.1, но он работает в WPF

Я разрабатываю приложение для хранения Windows 8.1 с С# и .NET Frameworkowork 4.5.1.

Я пытаюсь передать PasswordBox как параметр на кнопке Command. Я тестировал следующий код в WPF, и он работает.

MainViewModel класс:

public class MainViewModel : ViewModelBase
{
    private RelayCommand<PasswordBox> doLoginCommand;

    /// <summary>
    /// The <see cref="UserName" /> property name.
    /// </summary>
    public const string UserNamePropertyName = "UserName";

    private string _userName = string.Empty;

    /// <summary>
    /// Sets and gets the UserName property.
    /// Changes to that property value raise the PropertyChanged event. 
    /// </summary>
    public string UserName
    {
        get
        {
            return _userName;
        }
        set
        {
            Set(UserNamePropertyName, ref _userName, value);
        }
    }

    /// <summary>
    /// 
    /// </summary>
    public RelayCommand<PasswordBox> DoLoginCommand
    {
        get { return doLoginCommand; }
    }

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        ////if (IsInDesignMode)
        ////{
        ////    // Code runs in Blend --> create design time data.
        ////}
        ////else
        ////{
        ////    // Code runs "for real"
        ////}

        this.doLoginCommand = new RelayCommand<PasswordBox>((pb) => ExecuteDoLogin(pb), (pb) => CanDoLogin(pb));
        //this.doLoginCommand = new RelayCommand<PasswordBox>((pb) => ExecuteDoLogin(pb));
    }

    private void ExecuteDoLogin(object parameter)
    {
        PasswordBox passwordBox = parameter as PasswordBox;
        Debug.WriteLine(_userName);
        Debug.WriteLine(passwordBox.Password);
    }

    private bool CanDoLogin(object parameter)
    {
        Debug.WriteLine("CanDoLogin");
        PasswordBox passwordBox = parameter as PasswordBox;
        return ((!string.IsNullOrEmpty(_userName)) &&
            (!string.IsNullOrEmpty(passwordBox.Password)));
    }
}

И его View:

<Page
    x:Class="MyProject.W81.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MyProject.W81"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    DataContext="{Binding MainViewModel, Source={StaticResource Locator}}"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="33*"/>
            <ColumnDefinition Width="77*"/>
        </Grid.ColumnDefinitions>
        <StackPanel Grid.Column="1" HorizontalAlignment="Center" Height="400" Margin="0" VerticalAlignment="Center" Width="600">
            <TextBox
                x:Name="userName"
                TextWrapping="Wrap"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                Text="{Binding UserName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                Width="247"
                Margin="10,10,10,5"/>
            <PasswordBox
                x:Name="userPassword"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                Width="250"
                FontFamily="Global User Interface"
                Margin="10,5"/>
            <Button
                x:Name="loginButton"
                Content="Login"
                HorizontalAlignment="Left"
                VerticalAlignment="Stretch"
                Command="{Binding DoLoginCommand}"
                CommandParameter="{Binding ElementName=userPassword}"
                Margin="10,5" />
        </StackPanel>
    </Grid>
</Page>

Но в Windows 8.1 он не работает. Проблема в том, что loginButton всегда отключен.

Я удалил CanDoLogin в doLoginCommand, и я могу получить значения _userName и userPassword.Password.

Любые советы? Вы знаете, почему loginButton всегда отключен?

Ответ 1

Не нужно ли вызывать RaiseCanExecuteChanged в команде, тогда что-то меняется? Haven't не делал WPF в течение длительного времени, но в приложениях я всегда вызываю RaiseCanExecuteChanged.

В этом случае я бы назвал RaiseCanExecuteChanged в событии PasswordChanged.