【问题标题】:EditText Edit Feature in MVVMCrossMVVMCross 中的 EditText 编辑功能
【发布时间】:2016-10-06 11:41:32
【问题描述】:

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

<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" />

【问题讨论】:

    标签: c# xml xamarin mvvmcross


    【解决方案1】:

    由于android:editable="false"deprecated,您应该设置android:inputType="none" 以禁用EditText 上的输入。如果您希望将EditTextinputType 与MvvmCross 绑定,您可以创建一个Value Converter,它从您的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;
        }
    }
    

    在你的布局文件中:

    <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 上的可绑定布尔值。您可以使用任何类型作为源类型,它不必是布尔值。转换愉快!

    【讨论】:

    • 效果很好。但键盘不是数字或十进制。它是默认的字母键盘显示。
    • 这可能是我如何将标志枚举用于 InputTypes 的问题(我无法对其进行测试)。尝试只返回 InputTypes.NumberFlagSigned ?
    • 我刚刚能够正确测试这个 - 这是我返回的枚举的问题。我已经相应地更新了我的答案。
    【解决方案2】:

    我已经用其他方式解决了我的问题。创建自定义绑定以绑定 ViewEnabled 属性。

    自定义绑定代码

    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)
            {
    
            }
        }
    }
    

    在 setup.cs 文件中注册自定义绑定类。

    protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
    {
        base.FillTargetFactories(registry);
    
        registry.RegisterPropertyInfoBindingFactory(
                typeof(ViewEnabledTargetBinding),
                typeof(View), "Enabled");
    }
    

    为您的视图应用绑定

     local:MvxBind="Text Age; Enabled IsEnable"  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多