ListBox выдает ошибку TextControl Text Visualizer при прокрутке - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть список, код ниже, который я заполняю 900 пунктов.Когда я быстро прокручиваю список вниз, я получаю исключение: «ItemsControl несовместим с источником своих элементов».Любые идеи относительно того, что вызывает проблему?

                <ListBox x:Name="FileList" ItemsSource="{Binding Files}" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True" 
                     MaxHeight="520" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>
                            <CheckBox x:Name="FileChecked" IsChecked="{Binding Checked}" Grid.Column="0" BorderThickness="1"/>
                            <Label Content="{Binding Name}" Grid.Column="1" />
                            <Label Content="{Binding Source}" Grid.Column="2" Style="{StaticResource FileProperties}" />
                            <Label Content="{Binding Destination}" Grid.Column="3" Style="{StaticResource FileProperties}"/>
                            <Label Content="{Binding ArchiveLocation}" Grid.Column="4" Style="{StaticResource FileProperties}"/>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

введите описание изображения здесь

Вот видео проблемы.https://www.screencast.com/t/YUlp24zoXiG

1 Ответ

0 голосов
/ 20 февраля 2019

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

// Your code from GitHub unchanged
private async void Preview_Click(object sender, System.Windows.RoutedEventArgs e)
{
    vm.Files = new List<InstrumentFile>();

    try
    {
        for (int i = 0; i < InstrumentList.Items.Count; i++)
        {
            ListBoxItem lbi = (InstrumentList.ItemContainerGenerator.ContainerFromIndex(i)) as ListBoxItem;
            ContentPresenter cp = GetFrameworkElementByName<ContentPresenter>(lbi);
            DataTemplate dt = InstrumentList.ItemTemplate;
            CheckBox cb = (dt.FindName("InstrumentChecked", cp)) as CheckBox;

            if (cb.IsChecked == true)
            {
                List<InstrumentFile> instrumentFiles = new List<InstrumentFile>();
                Instrument instrument = ((Instrument)(InstrumentList.Items[i]));

                string[] files = Directory.GetFiles(instrument.FileSource);
                foreach (string file in files)
                {
                    FileInfo fi = new FileInfo(file);
                    instrumentFiles.Add(new InstrumentFile()
                    {
                        Name = fi.Name,
                        Source = instrument.FileSource,
                        Destination = instrument.Destination,
                        ArchiveLocation = instrument.ArchiveLocation
                    });
                }
                if (string.IsNullOrEmpty(instrument.FileExt) == false)
                {
                    IEnumerable<InstrumentFile> filteredFiles = instrumentFiles.Where(f => f.Name.ToUpper().EndsWith(instrument.FileExt.ToUpper()));
                    if (filteredFiles.Count() > 0)
                        vm.Files.AddRange(filteredFiles);
                }
                else
                {
                    if (instrumentFiles.Count > 0)
                        vm.Files.AddRange(instrumentFiles);
                }

            }
        }
    }
    catch (Exception ex)
    {
        await metroWindow.ShowMessageAsync("Exception Encountered", ex.Message, MessageDialogStyle.Affirmative, Helpers.DialogSettings());
    }
    FileCount.Content = vm.Files.Count.ToString() + " files";
}

Здесь вы инициализируете свойство Files в модели представления.Это приводит к обновлению привязки данных к пустому списку.Там нет проблем до сих пор.Однако затем вы добавляете вещи в Files, но эти изменения не распространяются на систему привязки данных, поскольку список в модели представления не является ObservableCollection.

. Эту проблему можно исправить впара способов.Одним из типов исправления является установка свойства Files в модели представления после того, как вы создали и заполнили список.Новый код будет выглядеть так (сокращенно):

private async void Preview_Click(object sender, System.Windows.RoutedEventArgs e)
{
    // Create new variable to store the list
    var files = new List<InstrumentFile>();

    // You do a bunch of things, but you now add items to files, not to vm.Files
    files.AddRange(filteredFiles);

    // Finally, change Files
    vm.Files = files
}

Эта последняя строка вызовет событие PropertyChanged в модели представления для обновления привязки данных, но будет сделано с полным спискомitems.

Второй тип исправлений - это изменение типа Files в вашей модели вида на ObservableCollection<InstrumentFile>.Каждый раз, когда вы вносите изменение в Files, возникает правильное событие для обновления привязки данных.

...