我已经尝试了很多方法来使它正常工作,但是我显然很想念something,因为无论我做什么,我的“ Register
”按钮都被启用了[[not 。
<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“ Documentation”,但这全是对话式的,我找不到任何足够具体的绑定按钮的IsEnabled属性的特定示例,可以带我到那里。肯定会得到一些帮助。 :)
客房部信息:我正在使用以下NuGet软件包(/库)
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>
所以这就是最终的工作;
我将Xaml更新为以下内容;
<Button Text="Register"
Style="{StaticResource RegularButtonStyle}"
WidthRequest="280"
x:Name="RegisterButton"
Command="{Binding RegisterButtonClickedCommand}">
<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>
还将RegisterViewModel.cs更新为以下内容;
public class RegisterViewModel : MvxViewModel, INotifyPropertyChanged { ... // Added this (and the inheriting from INotify.. [per @Adlorem] public event PropertyChangedEventHandler PropertyChanged; private bool _isRegisterButtonEnabled; public bool IsRegisterButtonEnabled { get { _mvxLogger.Log(MvxLogLevel.Trace, () => $"RegisterViewModel : IsRegisterButtonEnabled property get called. Returning: {_isRegisterButtonEnabled}"); return _isRegisterButtonEnabled; } set { _isRegisterButtonEnabled = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsRegisterButtonEnabled))); _mvxLogger.Log(MvxLogLevel.Trace, () => $"RegisterViewModel : IsRegisterButtonEnabled property set called. value: {value}"); } } ... private bool ShouldEnableRegisterButton() { var isValidUser = _userName.Validate(); var isValidPass = _password.Validate(); var isValidConfirmedPass = _confirmedPassword.Validate(); var shouldEnable = isValidUser && isValidPass && isValidConfirmedPass; // Must set this or the PropertyChanged definitely won't fire! IsRegisterButtonEnabled = shouldEnable; _mvxLogger.Log(MvxLogLevel.Trace, () => $"RegisterViewModel : ShouldEnableRegisterButton() called. Returning: {shouldEnable}"); return shouldEnable; } ... }
显然,这不是最佳选择。MvvmCross
的SetProperty()
应该触发PropertyChanged事件,由于某种原因,它不会触发。