Прошло некоторое время с тех пор, как я регулярно работал с 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 не меняет поведение.ProfilePages вызывается дважды, как и ожидалось в предыдущем сценарии (выстрел RaisePropertyChanged)ItemsControl, как и ожидалось. Однако после этого список элементов не обновляется.Я не могу объяснить поведение и понятия не имею, в чем проблема. Я проверил распространенные проблемы (неправильное определение ItemTemplate, отсутствие события CollectionChanged, ошибки макета, из-за которых элементы отображались невидимо, и т. д. без успеха).
Как можно объяснить такое поведение? Как это можно исправить?
Моей первой мыслью было, что ViewModelCollection не относится к типу IEnumerable? Но вы сказали, что иногда он показывает предметы. Вы пробовали использовать CollectionViewSource в XAML? Вы также можете создать временную коллекцию, а затем назначить ее своему свойству ProfilePages.
@kenny Это было так, спасибо!!
@kenny Не стесняйтесь публиковать ответ! Я удалю свой и отмечу как решенный!
@Марк, пожалуйста. Подтолкнул к ответу.





По запросу ОП, перенося мой комментарий в ответ, 15000 вот и мы;)
интересно, вставляете ли вы объекты в ProfilePages не в поток пользовательского интерфейса.
интересно, вставляете ли вы объекты в ProfilePages нет в потоке пользовательского интерфейса.