Xamarin listView выбирает неправильный элемент - PullRequest
0 голосов
/ 25 февраля 2020

Я начинаю с ксамарина. Я показываю список со всеми доступными языками. Пользователь нажимает на один и может сохранить его. Вот мой код XAML:

<ListView x:Name="LanguageList" 
           SelectionMode="Single"
           ItemSelected="OnSelected">
</ListView>

CS:

private async void SetListLanguage(bool init)
    {
        itemList = new ObservableCollection<string>();
        l = await TextToSpeech.GetLocalesAsync();
        foreach (var locale in l)
        {
            if (filter.Length == 0)
                itemList.Add(locale.Name);
            else if (locale.Name.Contains(filter))
                itemList.Add(locale.Name);
            if (init && locale.Name == "English")
            {
                Console.WriteLine("Initiating with English");
                local = locale;
            }
        }
        LanguageList.ItemsSource = itemList;
    }

void OnSelected(object sender, SelectedItemChangedEventArgs e)
    {
        selectedName = e.SelectedItem as string;
        Console.WriteLine("Selected " + selectedName);
        foreach (var locale in l)
        {
            if (selectedName != "" && locale.Name == selectedName)
            {
                Console.WriteLine("Registered locale for  " + selectedName);
                local = locale;
            }
        }
    }

Когда я нажимаю на любом языке, например на китайском, это дает мне странный вывод.

Selected Chinese (Taiwan)
    Registered locale for  Chinese (Taiwan)
    02-25 16:01:09.938 I/mono-stdout(15514): Selected Chinese (Taiwan)
    02-25 16:01:09.938 I/mono-stdout(15514): Registered locale for  Chinese (Taiwan)
    Selected 
    02-25 16:01:09.943 I/mono-stdout(15514): Selected 
    Selected Korean (South Korea)
    Registered locale for  Korean (South Korea)02-25 16:01:09.949 I/mono-stdout(15514): Selected Korean (South Korea)
    02-25 16:01:09.949 I/mono-stdout(15514): Registered locale for  Korean (South Korea)

Я пытался удалить корейский, он дает мне то же самое с французским. Так что это как-то связано с тем, что он первый в списке, но я не понимаю, почему.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

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

Код XAML:

<ListView ItemsSource="{Binding DataItems}" SelectedItem="{Binding SelectedData}" HasUnevenRows="True" SeparatorVisibility="None">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Frame Margin="10" Padding="0">
                    <Label Text="{Binding .}" Margin="20"/>
                </Frame>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Просмотреть код модели:

public class MainPageViewModel : INotifyPropertyChanged
{
    private static readonly HttpClient client = new HttpClient();

    private ObservableCollection<string> dataItems;
    public ObservableCollection<string> DataItems
    {
        get { return dataItems; }
        set
        {
            dataItems = value;
            OnPropertyChanged();
        }
    }

    private string selectedData;
    public string SelectedData
    {
        get { return selectedData; }
        set
        {
            selectedData = value;
            if (!string.IsNullOrEmpty(selectedData))
            {
                Application.Current.MainPage.DisplayAlert("Alert", selectedData, "Ok");
            }
            OnPropertyChanged();
        }
    }

    public MainPageViewModel()
    {
        GetData();
    }

    public async Task GetData()
    {

        DataItems = new ObservableCollection<string>() {"One","Two","Three","Four","Five" };

    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

Спасибо

Вывод: когда вы щелкаете по любому элементу списка, он отображает выбранный элемент в отображаемом предупреждении.

enter image description here

0 голосов
/ 26 февраля 2020

Console.Writeline вызывает эту ситуацию. Вместо этого вы можете использовать Debug.Writeline.

  private void OnSelected(object sender, SelectedItemChangedEventArgs e)
    {
        var selectedName = e.SelectedItem as string;
        //Console.WriteLine("Selected " + selectedName);
        Debug.WriteLine("Selected " + selectedName);
        foreach (var locale in l)
        {
            if (selectedName != "" && locale.Name == selectedName)
            {
                //Console.WriteLine("Registered locale for  " + selectedName);
                Debug.WriteLine("Registered locale for  " + selectedName);
                //local = locale;
            }
        }
    }

enter image description here

Оставьте Console.WriteLine в консольных приложениях, где он принадлежит, и используйте Debug.WriteLine где-либо еще , Цитата из блога. https://www.kolls.net/blog/?p=120

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...