ItemsControl не показывает предметы - PullRequest
0 голосов
/ 18 марта 2019

Прошло много времени с тех пор, как я работал с XAML на регулярной основе, и я борюсь с основами.

Я пытаюсь показать элементы в ItemsControl примерно так:

<DockPanel DockPanel.Dock="Left" Width="800">

    <TextBlock DockPanel.Dock="Top" Text="{Binding ProfilePages.Count}"></TextBlock>

    <Grid>
        <ItemsControl ItemsSource="{Binding ProfilePages}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="Hello World" Height="100" Width="200" Background="AliceBlue"></TextBlock>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

    </Grid>   

</DockPanel>

ViewModel так же прост:

public class XtmProjectViewModel : NotifyingObject
{
    private ViewModelCollection<XtmProfilePageViewModel, XtmProfilePage> _profilePages;

    public ViewModelCollection<XtmProfilePageViewModel, XtmProfilePage> ProfilePages
    {
        get { return _profilePages; }

        set
        {
            _profilePages = value;
            RaisePropertyChanged(() => ProfilePages);
        }
    }

    public ViewModelCollection<XtmSearchPageViewModel, XtmSearchPage> SearchPages { get; }

    public XtmProjectViewModel(XtmProject model)
    {
        ProfilePages = new ViewModelCollection<XtmProfilePageViewModel, XtmProfilePage>(model.ProfilePages, s => new XtmProfilePageViewModel(s));
        SearchPages = new ViewModelCollection<XtmSearchPageViewModel, XtmSearchPage>(model.SearchPages, s => new XtmSearchPageViewModel(s));
        ProfilePages.CollectionChanged += ProfilePages_CollectionChanged;
    }

    private void ProfilePages_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        Console.WriteLine("Test");
        RaisePropertyChanged(() => ProfilePages);
    }
}

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

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

  • Текстовый блок, связанный с ProfilePages.Count, работает должным образом, то есть отображаемое число - это количество элементов в списке.
  • Нет ошибок связывания
  • CollectionChangedсобытие ProfilePages -коллекции запускается корректно
  • Кроме того, добавление RaisePropertyChanged -вента для всего свойства коллекции в обработчике CollectionChanged не меняет поведение
  • .аксессоры get свойства ProfilePages вызываются дважды, как и ожидалось в предыдущем sceanrio (запуск RaisePropertyChanged)
  • Когда я редактирую XAML во время отладки, иногда элементы отображаются в ItemsControl, как и ожидалось.Список пунктов не обновляется впоследствии, однако

Я не могу объяснить поведение и понятия не имею, в чем проблема.Я проверил общие проблемы (неправильное определение ItemTemplate, пропущенное событие CollectionChanged, ошибки компоновки, вызывающие невидимое отображение элементов и т. Д. Безуспешно).

Как это поведение можно объяснить?Как это можно исправить?

1 Ответ

2 голосов
/ 18 марта 2019

По запросу ОП, переместив мой комментарий к ответу, 15000 вот и мы;)

интересно, если вы вставляете объекты в ProfilePages не в потоке пользовательского интерфейса.

...