Прошло много времени с тех пор, как я работал с 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
, ошибки компоновки, вызывающие невидимое отображение элементов и т. Д. Безуспешно).
Как это поведение можно объяснить?Как это можно исправить?