我有一个条目设置为最大长度为3。当用户尝试输入4个字符时,我想显示一个简单的DisplayAlert消息,如下所示。我正试图用MVVM实现它,但很难与警报所需的等待绑定。如果有帮助的话,我知道最大长度将永远是3。
Xaml:
<Entry Text = "{Binding BoundText}"/>
ViewModel:
string _boundText;
public string BoundText
{
get => _boundText;
set
{
if(value.Length > 3)
{
await DisplayAlert("Alert", "You have been alerted", "OK");
}
else
{
...
}
}
}
我得到的错误是等待操作符需要在async方法中,但是当我添加它时,我得到一个错误,即修饰符async对构造函数无效。对如何实现这一点有什么想法吗?
我们不能把async方法放到Setter
方法中。
并且不建议将DisplayAlert
放入viewmodel中,因为该方法属于页面,它破坏了mvvm模式。
这里有两个变通方法.
-
在
Setter
方法中发送MessagingCenter
,并在页面中做一些事情。//viewmodel set { if (value.Length > 3) { MessagingCenter.Send<object>(this, "Hi"); } ... //page public Page1() { InitializeComponent(); this.BindingContext = model; MessagingCenter.Subscribe<object>(this, "Hi", async (obj) => { await DisplayAlert("Alert", "You have been alerted", "OK"); }); }
-
在条目的
TextChanged
中处理。<Entry Text = "{Binding BoundText}" TextChanged="Entry_TextChanged"/> private async void Entry_TextChanged(object sender, TextChangedEventArgs e) { if(e.NewTextValue.Length > 3) { await DisplayAlert("Alert", "You have been alerted", "OK"); } }