C# MVVMCross中的编辑文本编辑功能

C# MVVMCross中的编辑文本编辑功能,c#,xml,xamarin,mvvmcross,C#,Xml,Xamarin,Mvvmcross,我想知道如何才能在mvvmcross中的EditText中启用和禁用编辑功能 <EditText style="@style/InputNumbersEditText" android:layout_weight="1" android:layout_width="0dp" android:focusable="true" android:layout_height="wrap_content" android:inputType="numberDeci

我想知道如何才能在
mvvmcross
中的
EditText
中启用禁用编辑功能

<EditText
   style="@style/InputNumbersEditText"
   android:layout_weight="1"
   android:layout_width="0dp"
   android:focusable="true"
   android:layout_height="wrap_content"
   android:inputType="numberDecimal|numberSigned"
   local:MvxBind="Text Age" />

由于
android:editable=“false”
是,您应该设置
android:inputType=“none”
以禁用对
EditText
的输入。如果要使用MvvmCross绑定
EditText
inputType
,可以创建一个从ViewModel中获取输入值的,并返回类型为
Android.Text.InputTypes
的答案

实施示例:

在Android项目中添加一个包含以下内容的类:

public class EditTextEnabledValueConverter : MvxValueConverter<bool, InputTypes>
{
    protected override InputTypes Convert(bool value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value)
            return InputTypes.ClassNumber | InputTypes.NumberFlagDecimal | InputTypes.NumberFlagSigned;

        return InputTypes.Null;
    }
}
公共类EditTextEnabledValueConverter:MvxValueConverter
{
受保护的替代输入类型转换(布尔值、类型targetType、对象参数、CultureInfo区域性)
{
如果(值)
返回InputTypes.ClassNumber | InputTypes.NumberFlagDecimal | InputTypes.NumberFlagSigned;
返回InputTypes.Null;
}
}
在布局文件中:

<EditText
   style="@style/InputNumbersEditText"
   android:layout_weight="1"
   android:layout_width="0dp"
   android:focusable="true"
   android:layout_height="wrap_content"
   local:MvxBind="Text Age; InputType EditTextEnabled(MyProperty)" />


其中MyProperty是ViewModel上的可绑定布尔值。您可以使用任何类型作为源类型,它不必是布尔值。转换快乐

我用另一种方法解决了我的问题。已创建自定义绑定以绑定已启用视图的属性

自定义绑定代码

public class ViewEnabledTargetBinding : MvxPropertyInfoTargetBinding<View>
{
    // used to figure out whether a subscription to MyPropertyChanged       

    public override MvxBindingMode DefaultMode => MvxBindingMode.TwoWay;

    public ViewEnabledTargetBinding(object target, PropertyInfo targetPropertyInfo)
        : base(target, targetPropertyInfo)
    {
    }

    // describes how to set MyProperty on MyView
    protected override void SetValueImpl(object target, object value)
    {
        var view = target as View;
        if (view == null) return;

        view.Enabled = (bool)value;
    }

    // is called when we are ready to listen for change events
    public override void SubscribeToEvents()
    {
        var view = View;
        if (view == null)
        {
            //MvxBindingTrace.Trace(MvxTraceLevel.Error, "Error - checkbox is null in CheckboxCheckedTargetBinding");
            return;
        }
    }       

    // clean up
    protected override void Dispose(bool isDisposing)
    {
        base.Dispose(isDisposing);

        if (isDisposing)
        {

        }
    }
}
为您的视图应用绑定

 local:MvxBind="Text Age; Enabled IsEnable"  

它工作得很好。但键盘不是数字或十进制的。这是默认的字母键盘显示。这可能是我如何使用输入类型的标志枚举的问题(我无法测试它)。尝试只返回InputTypes.NumberFlagSigned?我刚刚能够正确地测试它-这是我返回的枚举的一个问题。我已经相应地更新了我的答案。
 local:MvxBind="Text Age; Enabled IsEnable"