自从我定期与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);
}
}
qazxsw poi是一种自定义类型,可自动与基础模型集合同步。我已经在所有类型的场景中使用了多年而没有任何问题。
但是,在视图中,项目没有出现,我得到一个奇怪的行为,我无法解释:
ViewModelCollection
的文本块按预期工作,即显示的数字是列表中的项目数。ProfilePages.Count
集合的CollectionChanged
事件被正确解雇ProfilePages
事件处理程序中为整个集合属性添加RaisePropertyChanged
事件也不会改变行为CollectionChanged
属性的get访问器被调用两次,就像之前的sceanrio(解雇ProfilePages
)一样RaisePropertyChanged
中。但是,项目列表之后不会更新我无法解释这种行为,也不知道问题是什么。我检查了常见的麻烦(ItemsControl
的错误定义,缺少ItemTemplate
事件,布局错误导致项目无形地呈现等等,但没有成功)。
如何解释这种行为?怎么修好?
根据OP的要求,将我的评论移到答案,15000我们来了;)
想知道你是否将对象插入到不在UI线程上的ProfilePages中。