ItemsControl不显示项目

时间:2019-03-18 10:05:12

标签: wpf xaml itemscontrol

自从我定期使用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事件处理程序中为整个collection属性添加CollectionChanged事件不会改变行为
  • ProfilePages属性的get访问器在上一个sceanrio中被调用两次(触发RaisePropertyChanged
  • 在调试时编辑XAML时,有时项目会按预期显示在ItemsControl中。项目列表此后不会更新

我无法解释行为,也不知道问题是什么。我已经检查了常见的问题(ItemTemplate的错误定义,CollectionChanged事件的丢失,布局错误导致项目无法呈现的布局错误等)。

如何解释这种行为? 怎么解决?

1 个答案:

答案 0 :(得分:2)

应OP的要求,将我的评论移至答案,我们来了15000;)

想知道是否要将对象插入到不在UI线程上的ProfilePages中。