gpt4 book ai didi

c# - 将 Entry TextChanged 绑定(bind)到 Xamarin.Forms 中按钮命令的 CanExecute 方法

转载 作者:行者123 更新时间:2023-11-30 21:37:30 29 4
gpt4 key购买 nike

如果三个条目中的任何一个为空,我想禁用发送按钮,但如何以 MVVM 方式实现?

我想到了 CanExecute 委托(delegate),但如何在 TextChanged 触发时触发它?

此外,如果我选择这些行为,如果我正在使用 Behavior<Entry>,我该如何与按钮等其他控件进行通信?

这是 View :

<ContentPage.Content>
<AbsoluteLayout>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="56"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="10"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
<RowDefinition Height="50"/>
</Grid.RowDefinitions>
<Label Text="Contact Us" FontSize="Medium" Grid.ColumnSpan="3"/>
<Entry Text="{Binding ContactData.message_name}" x:Name="subject" Grid.Row="2" Grid.Column="1" Placeholder="Subject"/>
<Entry Keyboard="Email" Text="{Binding ContactData.receiver_email}" x:Name="email" Grid.Row="3" Grid.Column="1" Placeholder="Email"/>
<Editor Text="{Binding ContactData.message_subject}" x:Name="body" Grid.Row="4" Grid.Column="1" />

<Button Grid.Row="5" Grid.Column="1" Command="{Binding ContactFormSent}" Text="Send"/>
</Grid>
</AbsoluteLayout>
</ContentPage.Content>

在 View 模型中:

public ContactViewModel()
{
ContactFormSent = new RelayCommand(SendContactInfo);
ContactData = new ContactModel();
}

private bool CanSend() //this only get called when the view model is constructed
{
return !(string.IsNullOrWhiteSpace(ContactData.receiver_email) && string.IsNullOrWhiteSpace(ContactData.message_subject) &&
string.IsNullOrWhiteSpace(ContactData.message_name));
}

在“行为”选项中,我希望它与 Entry 一起使用和 Editor ,所以我要走的路是Behavior类,而不是通用版本?如果是这样,我该如何实现?

最佳答案

通常,为了使用 MVVM 模式对 View 事件使用react,建议您使用 EventToCommandBehaviour .

但在这种情况下不需要,因为绑定(bind)到 Entry 的属性的 setter 应该在每次文本更改时触发。您可以使用它在命令上触发 ChangeCanExecute() 以通知 View 现在可以启用/禁用按钮。

例如:

string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
if (_firstName != value)
SendCommand.ChangeCanExecute();
SetProperty(ref _firstName, value, nameof(FirstName));
}
}

string _lastName;
public string LastName
{
get { return _lastName; }
set
{
if (_lastName != value)
SendCommand.ChangeCanExecute();
SetProperty(ref _lastName, value, nameof(LastName));
}
}

string _email;
public string Email
{
get { return _email; }
set
{
if (_email != value)
SendCommand.ChangeCanExecute();
SetProperty(ref _email, value, nameof(Email));
}
}

Command _sendCommand;
public Command SendCommand
{
get
{
return _sendCommand ?? (_sendCommand = new Command(OnSend, CanSend));
}
}

bool CanSend(object obj)
{
return Validate();
}

void OnSend(object obj)
{
if(Validate())
{
//actual button click execution
}
}

bool Validate()
{
// disable button if any entry empty
return !string.IsNullOrEmpty(_firstName)
&& !string.IsNullOrEmpty(_lastName)
&& !string.IsNullOrEmpty(_email);
}

关于c# - 将 Entry TextChanged 绑定(bind)到 Xamarin.Forms 中按钮命令的 CanExecute 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47131362/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com