将 TextChange 用于多个条目时如何专注于一个条目

How to focus on one Entry when Using TextChange for multiple entries

我有 2 个条目。当我在条目 1 上点击任何东西时,我想在条目 2 上得到“是”,当我在条目 2 上输入任何东西时,我想得到“Noo”

问题:

当我点击条目 1 时,条目 2 发生变化并获得值“Noo”,但条目 1 也发生变化并获得值“yess”。

问题:

如何在不更改条目 1 的情况下点击条目 1 时更改条目 2。条目 2 也一样

这是 Xaml 代码:

 <Entry ClassId="1" x:Name="myWord1"TextChanged="OnEntryTextChange"/>
 <Entry ClassId="2"  x:Name="myWord2"  TextChanged="OnEntryTextChange"/>

代码:

 private async void OnEntryTextChange(object sender, TextChangedEventArgs e)
    {
        
            var EntryTapped = (Xamarin.Forms.Entry)sender;

            Device.BeginInvokeOnMainThread(() => {


                        if (EntryTapped.ClassId == "1")
                        {
                   
                           myWord2.Text="Noo";
                                                         
                        }
                     
                        
                        else if (EntryTapped.ClassId == "2")
                        {
                          
                        myWord1.Text="yess";                           
                        }

            });
    }

感谢您的帮助

有几种方法可以做到这一点:

  1. 使用绑定

在这种情况下,您将有 2 个私有变量和 2 个 public 变量,并且条目绑定到每个变量。检查此 link 如何实施 INotifyPropertyChanged

    private string entry1String;
    private string entry2String;
    public string Entry1String { 
        get => entry1String;
        set
        {
            entry2String = "Noo";
            entry1String = value;
            OnPropertyChanged(Entry1String);
            OnPropertyChanged(Entry2String);
        }
    }
    public string Entry2String { 
        get => entry2String;
        set
        {
            entry1String = "Yees";
            entry2String = value;
            OnPropertyChanged(Entry1String);
            OnPropertyChanged(Entry2String);
        }
    }

另一种方法是使用变量作为信号量。当变量为 True 时,该方法不能同时被另一个触发。

private bool semaphoreFlag=false;


private async void OnEntryTextChange(object sender, TextChangedEventArgs e)
{
    if(semaphoreFlag) return;
    semaphoreFlag=true;
        var EntryTapped = (Xamarin.Forms.Entry)sender;

        Device.BeginInvokeOnMainThread(() => {


                    if (EntryTapped.ClassId == "1")
                    {
               
                       myWord2.Text="Noo";
                                                     
                    }
                 
                    
                    else if (EntryTapped.ClassId == "2")
                    {
                      
                    myWord1.Text="yess";                           
                    }

        });
semaphoreFlag=false;
}

您可以使用 Focused 事件而不是 TextChanged 事件。

   <StackLayout>
        <Entry ClassId="1" x:Name="myWord1"  Focused="EntryFocused"/>
        <Entry ClassId="2"  x:Name="myWord2"  Focused="EntryFocused"/>
    </StackLayout>



   private void EntryFocused(object sender, FocusEventArgs e)
    {
        var EntryTapped = (Xamarin.Forms.Entry)sender;

        if (EntryTapped.ClassId == "1")
        {

            myWord2.Text = "Noo";

        }

        else if (EntryTapped.ClassId == "2")
        {

            myWord1.Text = "yess";
        }
    }