自从我定期使用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
)ItemsControl
中。项目列表此后不会更新我无法解释行为,也不知道问题是什么。我已经检查了常见的问题(ItemTemplate
的错误定义,CollectionChanged
事件的丢失,布局错误导致项目无法呈现的布局错误等)。
如何解释这种行为? 怎么解决?
答案 0 :(得分:2)
应OP的要求,将我的评论移至答案,我们来了15000;)
想知道是否要将对象插入到不在UI线程上的ProfilePages中。