C# Xamarin表格“;TextChanged";事件到MVVM?
我对C#、Xamarin表单和一般的编码是完全陌生的。我尝试过以下教程和Microsofts文档。然而,仍然有一些东西我似乎真的无法得到。这里我有一个Xaml中的条目: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"
<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>