Почему событие моего редактора завершено срабатывает каждый раз, когда я нажимаю на него? - PullRequest
0 голосов
/ 09 ноября 2019

My Xamarin.Forms имеет приложение ListView , где каждый ViewCell содержит Editor . При каждом нажатии Editor происходит событие Focused, но также происходит событие Completed, даже если Done или Enter не было нажатоклавиатура.

Кто-нибудь знает, что происходит и как мне это исправить?

Ответы [ 2 ]

1 голос
/ 10 ноября 2019

Источник вашей проблемы

Проблема, с которой вы сталкиваетесь, заключается в том, что после того, как вы нажали Редактор , когда вы нажмете другую, первая будет реагировать как Completed, а новый постучал реагирует как Focused. С этого момента каждый раз, когда вы нажимаете на редактор, оба EventHandlers будут вызываться: Completed, чтобы указать, что предыдущий редактор Завершено ! и Focused, чтобы указать, что новый редактор Сфокусированный .


Возможное обходное решение

Отказ от ответственности: приведенный ниже код предназначен только для предложенияспособ обойти эту проблему, и я ни в коем случае не пытаюсь сказать, что это оптимальный или производственный код.

Я предполагаю, что вы решили использовать подход, который вы используете, потому что вы думаете,это лучший вариант для вашего случая использования.

Сказав это, если бы мне пришлось обойти вашу проблему, я бы расширил объект, который вы используете для подачи ListView , чтобы включить id , а затем извлекаем id в EventHandler, чтобы узнать, какой именно объект вызывает событие .

Посмотрите, например, чтобы изучить вашу проблему, я определил следующий объект

public class People
{

    public int id { get; set; }

    public String FullName { get; set; }

    public string Location { get; set; }

    public Boolean IsVisible { get; set; }

}

, затем в методе OnAppearing я написал

protected override void OnAppearing()
{
    List<People> i = new List<People>() { new People() { id = 0 }, new People() { id = 1 } };

    BindingContext = i;

    base.OnAppearing();
}

В XAML я создал простой ListView как

<ContentPage.Content>
    <ListView ItemsSource="{Binding .}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Editor Focused="Editor_Focused"
                            Completed="Editor_Completed"/>

                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentPage.Content>

И так, в код за я смог отреагировать в EventHandler с соответственно

private void Editor_Focused(object sender, FocusEventArgs e)
{

    var tappedItemId = ((People)((Editor)sender).BindingContext).id;

}

private void Editor_Completed(object sender, EventArgs e)
{

    var tappedItemId = ((People)((Editor)sender).BindingContext).id;

}

Я надеюсь, что после прочтения этой проблемы вы сможете увидеть ее.

Удачного кодирования!

0 голосов
/ 09 ноября 2019

Вместо этого используйте событие TextChanged https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/editor

void EditorTextChanged (object sender, TextChangedEventArgs e)
{
   var oldText = e.OldTextValue;
   var newText = e.NewTextValue;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...