我正在尝试将图像显示在WPF ListView中,如同旧版ATC Avalon团队文章How to Create a Custom View中描述的WrapPanel一样。
当我尝试使用LINQ-to-Entities查询的ADO.NET Entity Framework对象集合填充ListView时,我得到以下异常:
异常
之前项目集合必须为空 使用ItemsSource。
我的代码......
Visual Basic
Private Sub Window1_Loaded(...) Handles MyBase.Loaded
ListViewImages.ItemsSource = From g In db.Graphic _
Order By g.DateAdded Ascending _
Select g
End Sub
XAML
<ListView Name="ListViewImages"
SelectionMode="Single"
ItemsSource="{Binding}">
<local:ImageView />
</ListView>
我在那条线上放了一个断点。在LINQ赋值之前ListViewImages.ItemsSource
是Nothing
。
答案 0 :(得分:167)
我在稍微不同的情况下有一段时间同样的错误。我有
<wpftoolkit:DataGrid
AutoGenerateColumns="False"
ItemsSource="{Binding Path=Accounts}" >
<wpftoolkit:DataGridTextColumn
Header="Account Name"
Binding="{Binding Path=AccountName}" />
</wpftoolkit:DataGrid>
我修正了
<wpftoolkit:DataGrid
AutoGenerateColumns="False"
ItemsSource="{Binding Path=Accounts}" >
<wpftoolkit:DataGrid.Columns>
<wpftoolkit:DataGridTextColumn
Header="Account Name"
Binding="{Binding Path=AccountName}" />
</wpftoolkit:DataGrid.Columns>
</wpftoolkit:DataGrid>
答案 1 :(得分:115)
抛出此特定异常的原因是元素的内容应用于ListView的Items集合。因此,XAML在其Items集合中使用单个本地:ImageView初始化ListView。但是当使用ItemsControl时,您必须使用Items属性或ItemsSource属性,不能同时使用它们。因此,当处理ItemsSource属性时,将抛出异常。
通过查找类中的ContentPropertyAttribute,您可以找出元素内容将应用于哪个属性。在这种情况下,类层次结构中的defined更高,在ItemsControl上:
[ContentPropertyAttribute("Items")]
这里的意图是将ListView的View设置为local:ImageView,因此修复是明确指出要设置的属性。
修复XAML并且异常消失:
<ListView Name="ListViewImages"
SelectionMode="Single"
ItemsSource="{Binding}">
<ListView.View>
<local:ImageView />
</ListView.View>
</ListView>
缺少<ListView.View>
标记。
答案 2 :(得分:62)
我刚刚遇到了这个问题的一个非常阴险的例子。我的原始片段要复杂得多,这使得很难看到错误。
<ItemsControl
Foreground="Black" Background="White" Grid.IsSharedSizingScope="True"
x:Name="MyGrid" ItemsSource="{Binding}">
>
<ItemsControl.ItemsPanel>
<!-- All is fine here -->
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<!-- All is fine here -->
</ItemsControl.ItemTemplate>
<!-- Have you caught the error yet? -->
</ItemsControl>
这个错误?初始打开<ItemsControl>
标记后的额外&gt; ! <
已应用于内置Items集合。稍后设置DataContext时,即时crashola。因此,在调试此问题时,请注意不仅仅是围绕ItemsControl特定数据子项的错误。
答案 3 :(得分:39)
我对不同的情况也是如此。
<ComboBox Cursor="Hand" DataContext="{Binding}"
FontSize="16" Height="27" ItemsSource="{Binding}"
Name="cbxDamnCombo" SelectedIndex="0" SelectedValuePath="MemberId">
<DataTemplate>
<TextBlock DataContext="{Binding}">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} / {1}">
<Binding Path="MemberName"/>
<Binding Path="Phone"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox>
现在当你完成缺少的标签 Control.ItemTemplate 时,一切都恢复正常:
<ComboBox Cursor="Hand" DataContext="{Binding}"
FontSize="16" Height="27" ItemsSource="{Binding}"
Name="cbxDamnCombo" SelectedIndex="0" SelectedValuePath="MemberId">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock DataContext="{Binding}">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} / {1}">
<Binding Path="MemberName"/>
<Binding Path="Phone"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
<ComboBox.ItemTemplate>
</ComboBox>
答案 4 :(得分:24)
我在不同的场景中遇到了同样的错误
<ItemsControl ItemsSource="{Binding TableList}">
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl>
解决方案是在ItemsControl.ItemsPanel
ItemsPanelTemplate
标记
<ItemsControl ItemsSource="{Binding TableList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
答案 5 :(得分:12)
异常
在使用ItemsSource之前,项目集合必须为空。
当您通过不同来源向ItemsSource
添加项目时会发生此异常。所以
确保您没有意外错过了标签,放错了标签,添加了额外的标签或错误编写了标签。
<!--Right-->
<ItemsControl ItemsSource="{Binding MyItems}">
<ItemsControl.ItemsPanel.../>
<ItemsControl.MyAttachedProperty.../>
<FrameworkElement.ActualWidth.../>
</ItemsControl>
<!--WRONG-->
<ItemsControl ItemsSource="{Binding MyItems}">
<Grid.../>
<Button.../>
<DataTemplate.../>
<Heigth.../>
</ItemsControl>
虽然已ItemsControl.ItemsSource
已设置Binding
,但其他项(网格,按钮,...)无法添加到源中。
但是,ItemsSource
未使用时,以下代码允许:
<!--Right-->
<ItemsControl>
<Button.../>
<TextBlock.../>
<sys:String.../>
</ItemsControl>
注意缺少的ItemsSource="{Binding MyItems}"
部分。
答案 6 :(得分:11)
以不同的方式陈述答案;验证没有缺少父节点或节点不正确。
ItemsPanelTemplate
子节点
<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
<ItemsPanelTemplate>
<UniformGrid Rows="1" />
</ItemsPanelTemplate>
...
</ItemsControl>
<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
<ItemsControl.ItemsPanel> <!-- I am the missing parent! -->
<ItemsPanelTemplate>
<UniformGrid Rows="1" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
...
</ItemsControl>
答案 7 :(得分:5)
将模板列保留在DataGrid.Columns中。这有助于我解决这个问题。
参考:DataGridTemplateColumn : Items collection must be empty before using ItemsSource.
答案 8 :(得分:4)
在我的例子中,它只是ListView中的一个额外的StackPanel:
<ListView Name="_details" Margin="50,0,50,0">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Location.LicenseName, StringFormat='Location: {0}'}"/>
<TextBlock Text="{Binding Ticket.Employee.s_name, StringFormat='Served by: {0}'}"/>
<TextBlock Text="{Binding Ticket.dt_create_time, StringFormat='Started at: {0}'}"/>
<Line StrokeThickness="2" Stroke="Gray" Stretch="Fill" Margin="0,5,0,5" />
<ItemsControl ItemsSource="{Binding Items}"/>
</StackPanel>
</StackPanel>
</ListView>
变为:
<ListView Name="_details" Margin="50,0,50,0">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Location.LicenseName, StringFormat='Location: {0}'}"/>
<TextBlock Text="{Binding Ticket.Employee.s_name, StringFormat='Served by: {0}'}"/>
<TextBlock Text="{Binding Ticket.dt_create_time, StringFormat='Started at: {0}'}"/>
<Line StrokeThickness="2" Stroke="Gray" Stretch="Fill" Margin="0,5,0,5" />
<ItemsControl ItemsSource="{Binding Items}"/>
</StackPanel>
</ListView>
一切都很顺利。
答案 9 :(得分:4)
就我而言,它没有为ItemsControl使用DataTemplate。
旧:
<ItemsControl Width="243" ItemsSource="{Binding List, Mode=TwoWay}">
<StackPanel Orientation="Horizontal">
<TextBox Width="25" Margin="0,0,5,0" Text="{Binding Path=Property1}"/>
<Label Content="{Binding Path=Property2}"/>
</StackPanel>
</ItemsControl>
新:
<ItemsControl Width="243" ItemsSource="{Binding List, Mode=TwoWay}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBox Width="25" Margin="0,0,5,0" Text="{Binding Path=Property1}"/>
<Label Content="{Binding Path=Property2}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
答案 10 :(得分:3)
我的是数据网格样式。如果您遗漏了样式周围的<DataGrid.RowStyle>
标签,则会出现问题。奇怪的是它有点像这样工作了。这是糟糕的代码。
<DataGrid Name="DicsountScheduleItemsDataGrid"
Grid.Column="0"
Grid.Row="2"
AutoGenerateColumns="false"
ItemsSource="{Binding DiscountScheduleItems, Mode=OneWay}">
<Style TargetType="DataGridRow">
<Setter Property="IsSelected"
Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
和好的
<DataGrid Name="DicsountScheduleItemsDataGrid"
Grid.Column="0"
Grid.Row="2"
AutoGenerateColumns="false"
ItemsSource="{Binding DiscountScheduleItems, Mode=OneWay}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsSelected"
Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</DataGrid.RowStyle>
答案 11 :(得分:2)
我有同样的错误。问题是这个额外的符号“&gt;”标签&lt; /ComboBox.SelectedValue>之间错误添加;和&lt; / ComboBox&gt;:
<ComboBox
ItemsSource="{Binding StatusTypes}"
DisplayMemberPath="StatusName"
SelectedValuePath="StatusID">
<ComboBox.SelectedValue>
<Binding Path="StatusID"/>
</ComboBox.SelectedValue>
>
</ComboBox>
这是正确的代码:
<ComboBox
ItemsSource="{Binding StatusTypes}"
DisplayMemberPath="StatusName"
SelectedValuePath="StatusID">
<ComboBox.SelectedValue>
<Binding Path="StatusID"/>
</ComboBox.SelectedValue>
</ComboBox>
答案 12 :(得分:2)
当我尝试将上下文菜单应用到TreeView
时,我遇到了这个错误。那些尝试结束了一个糟糕的XAML,它以某种方式编译:
<TreeView Height="Auto" MinHeight="100" ItemsSource="{Binding Path=TreeNodes, Mode=TwoWay}"
ContextMenu="{Binding Converter={StaticResource ContextMenuConverter}}">
ContextMenu="">
<TreeView.ItemContainerStyle>
...
请注意有问题的一行:ContextMenu="">
我不知道为什么编译,但我认为值得一提的是这个神秘异常消息的原因。像Armentage说的那样,仔细看看XAML,特别是在你最近编辑过的地方。
答案 13 :(得分:1)
也许不是这么有用的答案,但是在更改列顺序时我遇到了同样的问题,并且像下面的示例中那样犯了错误。有很多列,我重新排序它们,并在关闭标记/DataGrid.Columns
之后以某种方式粘贴了一个:
<DataGridTemplateColumn x:Name="addedDateColumn" Header="Added Date" Width="SizeToHeader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=AddedDate}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<DataGridTemplateColumn x:Name="rowguidColumn" Header="rowguid" Width="SizeToHeader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=rowguid}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid>
无论如何,因此而失去了半个小时。希望这有助于其他人。
答案 14 :(得分:1)
我遇到了这个问题,因为XAML中缺少一级标记<ListView.View>
。
此代码产生了此错误。
<Grid>
<ListView Margin="10" Name="lvDataBinding" >
<GridView>
<GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
<GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" />
</GridView>
</ListView>
</Grid>
以下内容已解决
<Grid>
<ListView Margin="10" Name="lvDataBinding" >
<ListView.View> <!-- This was missing in top! -->
<GridView>
<GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
<GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
答案 15 :(得分:0)
我在另一种情况下遇到此错误。我试图直接在<TreeView>
内为TreeViewItems定义样式,但是应该将其嵌入<TreeView.ItemContainerStyle>
内。
错误:
<TreeView ItemsSource="{Binding ExampleListView}">
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding SubItemListList}">
...
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
正确:
<TreeView ItemsSource="{Binding ExampleListView}">
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding SubItemListList}">
...
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
答案 16 :(得分:0)
我也有同样的错误。
就我而言,我只是删除了一行 <UniformGrid Columns="3" />
<ListBox>
<UniformGrid Columns="3" /> // remove this line!!!!
...
</ListBox>
答案 17 :(得分:-1)
小心拼写错误!我有以下
<TreeView ItemsSource="{Binding MyCollection}">
<TreeView.Resources>
...
</TreeView.Resouces>>
</TreeView>
(注意拖尾&gt; ,这被解释为内容,所以你设置了两倍的内容......花了一些时间:)