条目绑定到 int?在 Xamarin 形式中

Posted

技术标签:

【中文标题】条目绑定到 int?在 Xamarin 形式中【英文标题】:Entry binding to int? in Xamarin Forms 【发布时间】:2017-07-30 16:38:45 【问题描述】:

我在 Xamarin Forms 中有一个简单的条目:

<Entry Text="Binding Number, Mode=TwoWay" Placeholder="Number" Keyboard="Numeric" />

在 ViewModel 中有属性:

    private int? _number;
    public int? Number
    
        get  return _number; 
        set
        
            if (SetProperty(ref _number, value))
            
                OnPropertyChange(nameof(Number));
            
        
    

我在 Entry 中输入数字并按下按钮,但在按钮单击过程中 - 数字仍然为空。我做错了什么?

【问题讨论】:

Binding系统包含一些明显的类型转换,但是String到Int32呢?不是其中之一 【参考方案1】:

您可以将 int 绑定到 Entry 您不能绑定可为空的 int。您可以添加另一个将数字转换为字符串的属性,或者您可以轻松地创建一个像这样的值转换器...

class NullableIntConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    
        var nullable = value as int?;
        var result = string.Empty;

        if (nullable.HasValue)
        
            result = nullable.Value.ToString();
        

        return result;
    

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    
        var stringValue = value as string;
        int intValue;
        int? result = null;

        if (int.TryParse(stringValue, out intValue))
        
            result = new Nullable<int>(intValue);
        

        return result;
    

...并像这样在您的页面中使用它...

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:IntBinding"
             x:Class="IntBinding.DemoPage">

    <ContentPage.Resources>
        <ResourceDictionary>
            <local:NullableIntConverter x:Key="NullableIntConverter" />
        </ResourceDictionary>
    </ContentPage.Resources>

    <StackLayout>
        <Entry Text="Binding Number, Mode=TwoWay, Converter=StaticResource NullableIntConverter" Placeholder="Number" Keyboard="Numeric" />
        <Label Text="Binding Number, Converter=StaticResource NullableIntConverter" />
    </StackLayout>
</ContentPage>

【讨论】:

您使用可为空的 int 构造函数而不是执行 result = intValue 是否有特殊原因? 您无法转换为负数,因为对话会在每个字符输入时发生,并且减号会转换为 null。【参考方案2】:

条目接受一个字符串。如果你想绑定一个 int 属性,你应该使用 IValueConverter 但我认为最好的解决方案是使用 String 属性而不是将值从 String 转换为 Int

public string StrNumber
   get 
        if (Number == null) 
            return "";
        else
            return Number.ToString();
   

   set 
       try 
           Number = int.Parse(value);
       
       catch
           Number = null;
       
   

【讨论】:

【参考方案3】:
public string MP  get; set; 
public float MainPrice => (float.TryParse(MP, out float mp)) ? mp : 0;

【讨论】:

以上是关于条目绑定到 int?在 Xamarin 形式中的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms - 否定布尔绑定值

Xamarin.Forms 条目 - 自定义行为和 MVVM

Xamarin 表单清除所有条目

Xamarin:使用本机库

在 Xamarin 中动态更改条目输入的 Tab 键顺序

Xamarin 形式:IValueConverter 在 Convert 方法中接收空值