微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Xamarin中输入条目时需要输入值

如何解决在Xamarin中输入条目时需要输入值

在我的应用程序中,有多个EntryButton

我想要的是Entry不应为空,如果为空,则Button将不起作用。例如就像HTML中的必填属性一样。

我问了Picker这样的类似问题,但是这种解决方案不适用于Entry

视图中的输入和按钮代码

<Entry
    Text="{Binding Email}"
    Keyboard="Email"
    ReturnType="Done"
    Placeholder="Enter Email">
</Entry>

<Entry
    Text="{Binding Password}"
    Keyboard="Numeric"
    IsPassword="true"
    ReturnType="Done"
    Placeholder="Enter Password">
</Entry>

<Button
    Text="Submit"
    Command="{Binding FormDataButtonCommand}"/>

viewmodel.cs中输入和按钮绑定的代码

#region Bindable Command
public ICommand FormDataButtonCommand => new Command(async () => await FormDataButton(default,default));
#endregion

#region Bindable Properties
private string _Email;
public string Email
{
get => _Email;
set => this.RaiseAndSetIfChanged(ref _Email,value);
}

private string _Password;
public string Password
{
get => _Password;
set => this.RaiseAndSetIfChanged(ref _Password,value);
}

解决方法

ICommand构造函数cat采用第二个参数CanExecute。您应该使用它来启用/禁用命令:

public ICommand FormDataButtonCommand { get; set; } 
...
FormDataButtonCommand = new Command(FormDataButton,CanFormData); // in ctor

public bool CanFormData(object obj)
{
     return !string.IsNullOrWhiteSpace(Email) && !string.IsNullOrWhiteSpace(Password);
}


private async void FormDataButton(object obj)
{
    // your logic here
}
,

Use Multi-Bindings

<ContentPage.Resources>
   <local:AnyNullValueCheckConverter x:Key="AnyNullValueCheckConverter" />
</ContentPage.Resources>
...
<Button>
   <Button.IsEnabled>
      <MultiBinding Converter="{StaticResource AnyNullValueCheckConverter}">
          <Binding Path="Email" />
          <Binding Path="Password" />
      </MultiBinding>
   </Button.IsEnabled>
</Button>

转换器

public class AnyNullValueCheckConverter: IMultiValueConverter
{
    public object Convert(object[] values,Type targetType,object parameter,CultureInfo culture)
    {
        if (values == null)
        {
            return false;
        }

        foreach (var value in values)
        {
            if (value is string str && string.IsNullOrEmpty(str))
            {
                return false;
            }
        }
        return true;
    }

    public object[] ConvertBack(object value,Type[] targetTypes,CultureInfo culture)
    {
       throw new NotImplementedException();
    }
}

您可以将其用于其他值,例如Button.TextColor而不是false返回Color.Gray,而不是true返回Color.Black。像这样的东西。

,

我非常喜欢https://www.reactiveui.net,并大量使用WhenAny... Observable和所有很酷的反应性内容

但是正如@Miamy所说的那样,该命令将被禁用,但是如果您要更改颜色或样式,我会这样做

<Entry
    Text="{Binding Email}"
    Keyboard="Email"
    ReturnType="Done"
    Placeholder="Enter Email">
</Entry>

<Entry
    Text="{Binding Password}"
    Keyboard="Numeric"
    IsPassword="true"
    ReturnType="Done"
    Placeholder="Enter Password">
</Entry>

<Button
    Text="Submit"
    IsEnabled="{Binding IsButtonEnabled}"
    Command="{Binding FormDataButtonCommand}"/>
private string _Email;
public string Email
{
 get => _Email;
 set {
    IsButtonEnabled = !string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(Password);
    this.RaiseAndSetIfChanged(ref _Email,value);
  }
}

private string _Password;
public string Password
{
 get => _Password;
 set {
    IsButtonEnabled = !string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(Email);
  this.RaiseAndSetIfChanged(ref _Password,value);
  }
}

private bool _IsButtonEnabled;
public bool IsButtonEnabled
{
 get => _IsButtonEnabled;
 set => this.RaiseAndSetIfChanged(ref _IsButtonEnabled,value);
}

不喜欢这样做,但是这是更简单的方法... IMO

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。