Xamarin.forms 为空时需要Xamarin条目控件中的Null值

Xamarin.forms 为空时需要Xamarin条目控件中的Null值,xamarin.forms,Xamarin.forms,在Xamarin表单中使用条目控件时,如果未触摸该控件,则返回Null。但是,如果用户输入任何内容,然后清除控件,它将返回string.Empty 理想情况下,我只想保留Null值,因为这些值进入数据库,正如您可以想象的那样,它与Nulls和空字符串不太一致 无论控件是否已编辑,实现保持为空的目标的最佳方法是什么 我考虑过转换器,但这意味着将它们添加到所有条目控件中,可能在数据访问层中执行某些操作。。。不确定这是否意味着所有属性都需要额外的代码。您可以使用行为 代码 public类EntryNu

在Xamarin表单中使用
条目
控件时,如果未触摸该控件,则返回
Null
。但是,如果用户输入任何内容,然后清除控件,它将返回
string.Empty

理想情况下,我只想保留
Null
值,因为这些值进入数据库,正如您可以想象的那样,它与
Null
s和空字符串不太一致

无论控件是否已编辑,实现保持
为空的目标的最佳方法是什么

我考虑过转换器,但这意味着将它们添加到所有
条目
控件中,可能在数据访问层中执行某些操作。。。不确定这是否意味着所有属性都需要额外的代码。

您可以使用行为

代码

public类EntryNullBehavior:Behavior
{
受保护的覆盖无效附加到(条目)
{
entry.TextChanged+=OnEntryTextChanged;
基本数据(条目);
}
受保护的覆盖无效OnDetachingFrom(条目)
{
entry.TextChanged-=OnEntryTextChanged;
base.OnDetachingFrom(条目);
}
void OnEntryTextChanged(对象发送方,textchangedventargs args)
{
如果(发件人是条目)
{
if(args.NewTextValue!=null&&args.NewTextValue.Equals(string.Empty))
{
entry.Text=null;
}
}
}
}
Xaml中的Usgae

xmlns:behavior="clr-namespace:DummyTestApp.Behavior"
...
<Entry x:Name="MyNullEntry" HeightRequest="50" FontSize="Large">
    <Entry.Behaviors>
        <behavior:EntryNullBehavior/>
    </Entry.Behaviors>
</Entry>
xmlns:behavior=“clr命名空间:DummyTestApp.behavior”
...

<强> P.S.现在我不知道你认为什么是多余的(见你的评论),但是这个解决方案是优雅的< /P> < P>我实际上做了一个非常简单的自定义控件,因为我对所有的入口控件都需要这个函数,所以对每一个添加行为都是没有意义的。

public class EntryEx : Entry
{
    protected override void OnTextChanged(string oldValue, string newValue)
    {
        base.OnTextChanged(oldValue, newValue == string.Empty ? null : newValue);
    }
}

感谢Jason的想法。

为什么不创建一个自定义条目控件来强制执行您想要的行为呢?我考虑过这一点,但认为将string.Empty转换为Null太过分了。谢谢。由于这将在整个大型项目中广泛使用,因此它需要易于集成,而无需向XAML代码中添加大量膨胀。现在,我想到了使用一个转换器,并实际开始实现它,然后遇到了一个障碍,一些入口控件已经使用了一个转换器。因此,考虑到事实,我认为(到目前为止)行为似乎是前进的方向。这是更好的,但你说自定义控件太过分了,所以我不得不写一个行为。首先考虑它似乎是,但随后实现行为我很快意识到它实际上需要更多的工作,并创建了更多的XAML代码。这是一个独立开发人员的缺点,我没有人能提出自己的想法:(
public class EntryEx : Entry
{
    protected override void OnTextChanged(string oldValue, string newValue)
    {
        base.OnTextChanged(oldValue, newValue == string.Empty ? null : newValue);
    }
}