C# Xamarin表格“;TextChanged";事件到MVVM?

C# Xamarin表格“;TextChanged";事件到MVVM?,c#,xamarin.forms,xamarin-forms-4,C#,Xamarin.forms,Xamarin Forms 4,我对C#、Xamarin表单和一般的编码是完全陌生的。我尝试过以下教程和Microsofts文档。然而,仍然有一些东西我似乎真的无法得到。这里我有一个Xaml中的条目: <Entry Placeholder="CPR nummer" HorizontalOptions="FillAndExpand"

我对C#、Xamarin表单和一般的编码是完全陌生的。我尝试过以下教程和Microsofts文档。然而,仍然有一些东西我似乎真的无法得到。这里我有一个Xaml中的条目:

                                    <Entry Placeholder="CPR nummer"
                                       HorizontalOptions="FillAndExpand"
                                       HeightRequest="50"
                                       MinimumHeightRequest="40"
                                       PlaceholderColor="Silver"
                                       Keyboard="Numeric"
                                       TextColor="Gray"
                                       x:Name="CPRnummer"
                                       MaxLength="11"
                                       TextChanged="CPRnummer_TextChanged"
                                       ReturnType="Go">
                            </Entry>

正如您所看到的,没有数据绑定(我似乎找不到正确的方法)。因此,我将文本更改事件放置在.cs文件(视图)中:

private void CPRnummer\u TextChanged(对象发送者,textchangedventargs e)
{
正则表达式r=新正则表达式(@“^\d{6}-\d{4}$”;
正则表达式r2=新正则表达式(@“^\d{1,6}”);
正则表达式r3=新正则表达式(@“^\d{6}-\d{0,4}$”;
CPRnummer.Text=Regex.Replace(e.NewTextValue,“[^-0-9]”,“”);
cpracpt.IsEnabled=false;
不透明度=0.5;
尝试
{
C1=e.OldTextValue.Length;
}
捕获(NullReferenceException)
{
如果(e.OldTextValue==null)
{
C1=0;
}
其他的
{
C1=e.OldTextValue.Length;
}
}
如果(!r.IsMatch(e.NewTextValue))
{
如果(例如NewTextValue.Length尝试“EventToCommandBehavior”

EventToCommandBehavior是一种允许用户通过事件调用命令的行为

还有两种选择:

  • 自己编写一个代码:
    检查,或。检查“行为”文件夹中的类,需要为“转换器”中的某些事件使用额外的转换器。它的用法如下

  • 摘自Xamarin.CommunityToolkit:
    为您的解决方案安装并按如下方式实施。
    (Xamarin.CommunityToolkit由官方团队发布,并得到社区的支持。)

  • //xaml中的示例代码
    
    Entry没有对应于TextChanged事件的命令。我个人的建议是,将重点放在让代码正常工作上,而不要太担心如何“正确”地执行它方式。处理草率的代码比处理不起作用的漂亮代码要好。首先让它工作,然后重构它以使其更干净。现在还不清楚你到底在问什么。你在找MVVM教程吗?这是一个离题的问题。你在理解如何在绑定场景中实现数据验证方面有困难吗对于Xamarin?我相信我们这里已经有了关于该主题的问题和答案。您在理解如何启用/禁用按钮方面有困难吗?同样地。请改进您的问题,使其包括一个适当的、详细和清晰的解释,说明代码的作用,它与您想要的有什么不同,以及您具体需要什么需要有关的帮助。@PeterDuniho我很抱歉这里不清楚。我很难理解如何将EventHandler从视图迁移到ViewModel。就我所知,应该可以使用“Text=“{Binding XXX,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"如果实现INotifyPropertyChanged接口。如果有人能提供一个使用该接口的示例,我将不胜感激。在web上有很多MVVM、数据绑定、验证等示例,甚至在这个网站上也有很多。你看了吗?道歉很好,但更好的是对问题。您可以从这里开始:。这里有一个适用的问答:1.2.
    Text={Binding entrytextmvm}
    ,并将逻辑放入setter。3.单击按钮时验证文本。
           private void CPRnummer_TextChanged(object sender, TextChangedEventArgs e)
        {
    
            Regex r = new Regex(@"^\d{6}-\d{4}$");
            Regex r2 = new Regex(@"^\d{1,6}");
            Regex r3 = new Regex(@"^\d{6}-\d{0,4}$");
    
    
            CPRnummer.Text = Regex.Replace(e.NewTextValue, "[^-0-9]", "");
            CPRAccept.IsEnabled = false;
            CPRAccept.Opacity = 0.5;
    
    
        
            try
            {
                C1 = e.OldTextValue.Length;
            }
    
            catch (NullReferenceException)
            {
                if (e.OldTextValue == null)
                {
                    C1 = 0;
                }
                else
                {
                    C1 = e.OldTextValue.Length;
                }
            }
    
            if (!r.IsMatch(e.NewTextValue))
            {
                if (e.NewTextValue.Length<7&&!r2.IsMatch(e.NewTextValue))
                {
                    CPRnummer.Text = Regex.Replace(e.NewTextValue, "[^0-9]", "");
                }
                
                else if (e.NewTextValue.Length==6&&r2.IsMatch(e.NewTextValue) && C1<e.NewTextValue.Length) {
    
                    if (CPRnummer.Text.Length == 6)
                    {
                        CPRnummer.Text = e.NewTextValue.Insert(6, "-");
                    }
                }
    
                else if (e.NewTextValue.Length > 6 && !r3.IsMatch(e.NewTextValue) && C1<e.NewTextValue.Length)
                {
                    CPRnummer.Text = Regex.Replace(e.NewTextValue, "[^0-9]", "");
                    if (CPRnummer.Text.Length > 6)
                    {
                        CPRnummer.Text = e.NewTextValue.Insert(6, "-");
                    }
                }
    
                else if (!r.IsMatch(e.NewTextValue) && e.NewTextValue.Length == 11)
                {
                    CPRnummer.Text = "";
                }
    
                else if (e.NewTextValue.Length == 10 && e.NewTextValue.All(char.IsDigit))
                {
                    CPRnummer.Text = e.NewTextValue.Insert(6, "-");
                }
    
            }
    
            else
            {
                CPRAccept.IsEnabled = true;
                CPRAccept.BackgroundColor = Color.Green;
                CPRAccept.Opacity = 1;
                CPRAccept.Focus();
            }
    
    //sample code in xaml
    <Entry ...>
        <Entry.Behaviors>
            <xct:EventToCommandBehavior
                EventName="TextChanged"
                Command="{Binding MVVMCommand}" />
        </Entry.Behaviors>
    </Entry>