Xamarin Android和Mvvmcross。在axml中绑定OnEditorAction
情况:我有一个包含EditText的视图列表。我希望用户能够修改文本,并且只在按下键盘上的“完成”按钮时将新文本发送到viewmodel。我的编辑文本已绑定,如下所示Xamarin Android和Mvvmcross。在axml中绑定OnEditorAction,android,xamarin,xamarin.android,mvvmcross,Android,Xamarin,Xamarin.android,Mvvmcross,情况:我有一个包含EditText的视图列表。我希望用户能够修改文本,并且只在按下键盘上的“完成”按钮时将新文本发送到viewmodel。我的编辑文本已绑定,如下所示 <EditText android:id="@+id/textNumero" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.23" android:textColor
<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" />
不幸的是,我无法访问我的活动,因为我正在绑定列表中的类
因此,我想在我的类中绑定一个命令,如下所示:
<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" />
但我不知道如何将ImeAction.Done
传递给我的命令,或者我是否收到类似的消息
关于剩下的部分,我可以得到一些帮助吗?您可以创建带有命令的自定义EditText,然后将其绑定到axml中 另一种选择是使用:
idEditText.OnEditorAction (ImeAction.Done) += (ViewModel as MyViewModel).EditCommand.Execute(whateveryouwanttouse);
要完成活动,您可以使用:
Mvx.Resolve<IMvxAndroidCurrentTopActivity>().Activity
Mvx.Resolve()活动
最后,我用斯图尔特的回答:
我只是稍微修改了代码,这样我就可以在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);
}
}
}
Mvx.Resolve<IMvxAndroidCurrentTopActivity>().Activity
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);
}
}