Nano Hash - криптовалюты, майнинг, программирование

SelectedItem UWP ListView сбрасывается, когда ListView находится в другом ListView с большими данными.

Когда DataTemplate большого ListView содержит маленький ListView, SelectedItem маленького ListView сбрасывается.
Я сделал образец приложения, которое выбирает страну каждого человека из трех вариантов. Я выбрал наконец небольшой элемент ListView (индекс: 999) из кода позади «Индия».
Но когда я прокручиваю страницу вниз, ничего не выбирается и журнал отладки выглядит так, как показано ниже.

[Журнал отладки]

Добавлено: Индия, Удалено:

Добавлено :, Удалено: Индия

[MainPage.xaml]

<ListView ItemsSource="{x:Bind People}" SelectionMode="None">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="local:Person">
            <StackPanel BorderBrush="Black" BorderThickness="0,0,0,1">
                <TextBlock Text="{x:Bind Country, Mode=OneWay}"/>
                <ListView x:Name="CountryList"
                            ItemsSource="{x:Bind Countries, Mode=OneWay}"
                            SelectedItem="{x:Bind Country, Mode=TwoWay}"
                            SelectionChanged="CountryList_SelectionChanged">
                </ListView>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

[MainPage.xaml.cs]

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    GenerateSampleData();
}

private void GenerateSampleData()
{
    for (int i = 0; i < 1000; i++)
    {
        People.Add(new Person
        {
            Countries = new List<string> { "China", "India", "USA" },
        });
    }
    People[999].Country = "India";
}

private void CountryList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    StringBuilder sb = new StringBuilder("Added:");
    foreach (var added in e.AddedItems)
    {
        if (added is string country)
        {
            sb.Append($" {country,-5}");
        }
    }

    sb.Append(", Removed:");
    foreach (var removed in e.RemovedItems)
    {
        if (removed is string country)
        {
            sb.Append($" {country,-5}");
        }
    }
    Debug.WriteLine(sb);
}

Полный исходный код приведен ниже.
https://github.com/tokane888/ListViewQuestion

И я не уверен, что это связано, но какой-то маленький ListView показан серым, как показано ниже.
(Я не трогал этот маленький ListView даже из кода или вручную.)
 Gray ListView < / а>

25.10.2018

Ответы:


1
  1. Причина, по которой ваш ListView элемент не выбирается, заключается в том, что вы устанавливаете свое свойство до фактической загрузки ListView. Лучше установить выбранный элемент в событии ListView Loaded.

  2. Вы видите серую область из-за ListView виртуализации, поскольку ваш ListView содержит большое количество данных.

Чтобы исправить обе проблемы, измените свой код, как показано ниже:

XAML:

<ListView ItemsSource="{x:Bind People}" SelectionMode="None">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:Person">
                    <StackPanel BorderBrush="Black" BorderThickness="0,0,0,1">
                        <TextBlock Text="{x:Bind Country, Mode=OneWay}"/>
                        <ListView x:Name="CountryList"
                                    ItemsSource="{x:Bind Countries, Mode=OneWay}"
                                    SelectedItem="{x:Bind Country, Mode=TwoWay}"
                                    SelectionChanged="CountryList_SelectionChanged"
                                    Loaded="CountryList_Loaded"
                                  >
                            <ListView.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel/>
                                </ItemsPanelTemplate>
                            </ListView.ItemsPanel>
                        </ListView>

                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
</ListView>

Код позади:

 public sealed partial class MainPage : Page
    {
        public ObservableCollection<Person> People { get; } = new ObservableCollection<Person>();

        public MainPage()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            GenerateSampleData();
        }

        private void GenerateSampleData()
        {
            for (int i = 0; i < 1000; i++)
            {
                People.Add(new Person
                {
                    Countries = new List<string> { "China", "India", "USA" },
                });
            }

        }

        private void CountryList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            StringBuilder sb = new StringBuilder("Added:");
            foreach (var added in e.AddedItems)
            {
                if (added is string country)
                {
                    sb.Append($" {country,-5}");
                }
            }

            sb.Append(", Removed:");
            foreach (var removed in e.RemovedItems)
            {
                if (removed is string country)
                {
                    sb.Append($" {country,-5}");
                }
            }
            Debug.WriteLine(sb);
        }

        private void CountryList_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
           People[999].Country = "India";
        }
    }

Также обратитесь к этому сообщению для получения более подробной информации.

26.10.2018
  • Спасибо за помощь. ‹VirtualizingStackPanel› работает хорошо, и теперь серый ListView не отображается. Но когда я прокручиваю вниз и снова прокручиваю вверх и вниз, выбор Индии отменяется. 26.10.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..