НЕ МОЖЕТ изменить состояние IsEnabled моей кнопки для изменения - PullRequest
0 голосов
/ 03 ноября 2019

Я пробовал множество способов воскресенья, чтобы заставить это работать, но мне явно не хватает что-то , потому что моя кнопка "Register" имеет значение , а не . независимо от того, что я делаю.

В моем XAML:

<Button Text="Register" 
        Style="{StaticResource RegularButtonStyle}" 
        WidthRequest="280"
        x:Name="RegisterButton">
    <!-- I HAD the following, but it wasn't working so I finally decided to try DataTriggers -->
    <!-- bindings:Bi.nd="Clicked RegisterButtonClickedCommand;IsEnabled IsRegisterButtonEnabled"> -->
    <Button.Triggers>
        <DataTrigger TargetType="Button"
                     Binding="{Binding IsRegisterButtonEnabled}"
                     Value="False">
            <Setter Property="IsEnabled" Value="False"></Setter>
        </DataTrigger>
        <DataTrigger TargetType="Button"
                     Binding="{Binding IsRegisterButtonEnabled}"
                     Value="True">
            <Setter Property="IsEnabled" Value="True"></Setter>
        </DataTrigger>
    </Button.Triggers>
</Button>

В ViewModel:

public class RegisterViewModel : MvxViewModel
{
    ...

    private bool _isRegisterButtonEnabled;
    public bool IsRegisterButtonEnabled
    {
        get => ShouldEnableRegisterButton();

        set
        {
            _isRegisterButtonEnabled = value;
            SetProperty(ref _isRegisterButtonEnabled, value);
        }
    }

    ...
    public IMvxCommand RegisterButtonClickedCommand { get; private set; }
    ...

    private void InitializeCommands()
    {
        ...
        RegisterButtonClickedCommand = new MvxCommand(RegisterUser);
    }

    ...

    private bool ShouldEnableRegisterButton()
    {
        var isValidUser = _userName.Validate();
        var isValidPass = _password.Validate();
        var isValidConfirmedPass = _confirmedPassword.Validate();

        var shouldEnable = isValidUser && isValidPass && isValidConfirmedPass;

        _mvxLogger.Log(MvxLogLevel.Trace, () => $"RegisterViewModel : ShouldEnableRegisterButton() called. Returning: {shouldEnable}");

        return shouldEnable;
    }

    ...
}

Я прочитал MvvmCross "Документация", но это всеразговорный, и я не могу найти каких-либо КОНКРЕТНЫХ примеров привязки к свойству IsEnabled кнопки с достаточной спецификой, чтобы попасть туда.

Конечно, буду признателен за помощь. :)

Хозяйственная информация: я использовал следующие пакеты NuGet (/ библиотеки)
  • MvvmCross & MvvmCross.Forms v6.3.1
  • Xamarin.Forms v4.0.0.497661
  • Xamarin.Android. * Libs is all v28.0.0.1
Затем подумал, что мне следует обновить, поскольку есть доступные обновления, поэтому я обновился до следующего;
  • MvvmCross & MvvmCross.Forms v6.4.1
  • Xamarin.Forms v4.2.0.848062
  • Xamarin.Android. * Все библиотеки теперь v28.0.0.3

Также используется .Net Standard v2.0.3 для общих ресурсов.

1 Ответ

0 голосов
/ 03 ноября 2019

Вы можете попробовать это:

public class RegisterViewModel : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;
    private bool _isRegisterButtonEnabled;

    public bool IsRegisterButtonEnabled
    {
        set { _isRegisterButtonEnabled = value; PropertyChanged?.Invoke(this, new 
        PropertyChangedEventArgs(nameof(IsRegisterButtonEnabled))); }
        get { return _isRegisterButtonEnabled; }
    }
}

затем в Xaml

<Button Text="Register" 
        Style="{StaticResource RegularButtonStyle}" 
        IsEnabled = "{Binding IsRegisterButtonEnabled}"
        WidthRequest="280"
        x:Name="RegisterButton">
</Button>
...