[英]Xamarin Android with Mvvmcross. Binding an OnEditorAction in axml
情況:我有一個包含EditText的視圖列表。 我希望用戶能夠修改文本,並且僅當他按鍵盤上的完成按鈕時才將其新文本發送到視圖模型。 我的編輯文字已綁定
<EditText
android:id="@+id/textNumero"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="0.23"
android:textColor="#ffffffff"
local:MvxBind="Text BarilId" />
我在互聯網上發現我可以使用此事件來做我想做的事情:
idEditText.OnEditorAction (ImeAction.Done) += //insert delegate here
不幸的是,由於我將班級綁定到列表中,因此我無法參加活動。
因此,我想像這樣在我的班級中綁定一個命令:
<EditText
android:id="@+id/textNumero"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="0.23"
android:textColor="#ffffffff"
local:MvxBind="OnEditorAction EditCommand"
local:MvxBind="Text BarilId" />
命令 :
private IMvxCommand _editCommand;
public IMvxCommand EditCommand
{
get {
_editCommand = _editCommand ?? new MvxCommand(() => {
//do validation here
});
return _editCommand;
}
}
但是我不知道如何將ImeAction.Done
傳遞給我的命令,或者我什至沒有收到類似的信息。
我可以在其余部分上尋求幫助嗎?
您可以創建具有命令的自定義EditText,然后可以將其綁定到axml中。
另一種選擇是使用:
idEditText.OnEditorAction (ImeAction.Done) += (ViewModel as MyViewModel).EditCommand.Execute(whateveryouwanttouse);
要進行活動,您可以使用:
Mvx.Resolve<IMvxAndroidCurrentTopActivity>().Activity
最后,我在此使用Stuart答案: https : //stackoverflow.com/a/19221385/1188639
我只是稍微更改了代碼,所以可以在SubscibeToEvents()中使用OnEditorAction並更改handle函數。 整個類看起來像這樣:
public class MvxEditTextEditForBinding: MvxAndroidTargetBinding
{
protected EditText EditText
{
get { return (EditText)Target; }
}
private bool _subscribed;
public MvxEditTextEditForBinding(EditText view)
: base(view)
{
}
protected override void SetValueImpl(object target, object value)
{
var editText = EditText;
if (editText == null)
return;
value = value ?? string.Empty;
editText.Text = value.ToString();
}
public override MvxBindingMode DefaultMode
{
get { return MvxBindingMode.TwoWay; }
}
public override void SubscribeToEvents()
{
var editText = EditText;
if (editText == null)
return;
editText.EditorAction += HandleEditForChange;
_subscribed = true;
}
private void HandleEditForChange(object sender, TextView.EditorActionEventArgs e)
{
var editText = EditText;
InputMethodManager imm = (InputMethodManager)editText.Context.GetSystemService(Context.InputMethodService);
imm.HideSoftInputFromWindow(editText.WindowToken, 0);
e.Handled = false;
if (e.ActionId == ImeAction.Done)
{
FireValueChanged(editText.Text);
e.Handled = true;
}
}
public override Type TargetType
{
get { return typeof(string); }
}
protected override void Dispose(bool isDisposing)
{
if (isDisposing)
{
var editText = EditText;
if (editText != null && _subscribed)
{
editText.EditorAction -= HandleEditForChange;
_subscribed = false;
}
}
base.Dispose(isDisposing);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.