“在使用ItemsSource之前,Items集合必须为空。”


172

我正在尝试使图像显示在WPF ListView中,样式类似于WrapPanel,如旧ATC Avalon团队文章:如何创建自定义视图中所述

当我尝试使用LINQ-to-Entities查询的ADO.NET实体框架对象集合填充ListView时,出现以下异常:

例外

使用ItemsSource之前,Items集合必须为空。

我的代码...

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>

我在那条线上设置了一个断点。 ListViewImages.ItemsSourceNothing刚刚LINQ分配之前。

Answers:


127

引发此特定异常的原因是该元素的内容被应用于ListView的Items集合。因此,XAML在其Items集合中使用单个local:ImageView初始化ListView。但是,在使用ItemsControl时,必须使用Items属性或ItemsSource属性,不能同时使用两者。因此,当ItemsSource属性得到处理时,将引发异常。

您可以通过在类上查找ContentPropertyAttribute来找出元素内容将应用于哪个属性。在这种情况下,它是在类层次结构中的ItemsControl上定义的:

[ContentPropertyAttribute("Items")]

这样做的目的是将ListView的View设置为local:ImageView,因此解决方法是显式指示要设置的属性。

修复XAML,异常消失了:

<ListView Name="ListViewImages"
          SelectionMode="Single"
          ItemsSource="{Binding}">
    <ListView.View>
        <local:ImageView />
    </ListView.View>
</ListView>

它缺少该<ListView.View>标签。


6
这个答案是正确的。但是在检查这种情况之前,请像其他答案中所述,检查您的xaml是否正确。否则,您可能会花费大量时间查看ItemSource的等,最终发现它是由一个小的错字引起的。
pjm

182

在稍有不同的情况下,我有一段时间会遇到相同的错误。我有

<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>

15
谢谢!如此简单的问题……却是令人困惑的错误。
Scott

15
对我而言,区别只是缺少了<DataGrid.Columns>(而且我什至没有使用wpftoolkit)。
戴夫

1
我也缺少<DataGrid.Columns>。
2013年

67

我只是遇到了这个问题的非常阴险的例子。我的原始片段要复杂得多,因此很难看到错误。

   <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>标记之后!该<GOT适用于内置项集合。稍后设置DataContext时,立即崩溃。因此,在调试此问题时,不仅要注意围绕ItemsControl特定数据子项的错误,而且还要注意。


4
我也发生了同样的事情:Extra >=> Exception
surfen

7
当然,不仅仅是这样做。任何不小心键入的字符将自己变成项。您可以通过临时删除ItemsSource属性来检查这种情况。如果数据网格中仍然有行,则需要检查多余的字符
Simon_Weaver

4
Armentage ...您救了我,我不知道要花多少小时!非常感谢您发布此...投票!
约翰·费尔班克斯

1
很有意思。我不确定为什么这不是编译错误。它也有我!
shawn1874 2015年

1
哦,天哪,我遇到了同样的错误:Extra“>”。我可以给你买啤酒吗?真是一个奇怪的错误,没有编译错误很难发现!这挽救了我的一天!
比约恩·格罗斯曼

40

我也有不同的看法。

<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>

1
为什么WPF一定要如此显而易见?为ListBox设置DataTemplate会引起有趣的异常,但没有一个导致正确的方向。
阿洛伊斯·克劳斯

这在使用时固定给我<ItemsControl>
RHaguiuda

27

在不同的情况下我也遇到了同样的错误

<ItemsControl ItemsSource="{Binding TableList}">
    <ItemsPanelTemplate>
        <WrapPanel Orientation="Horizontal"/>
    </ItemsPanelTemplate>
</ItemsControl>

解决方法是ItemsControl.ItemsPanelItemsPanelTemplate

<ItemsControl ItemsSource="{Binding TableList}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

这就是解决我的问题的原因!
RDV

14

To️用不同的方式陈述答案 ⚠️

X 在Xaml中,确认定义的区域中没有丢失的父节点或不正确的节点

例如

这失败了:

有没有合适的 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>

provided <ItemsControl.ItemsPanel>提供了一个正确的父节点^^^。💡


2
这个。丢失了<DataGrid.Columns>,直接在模板列中<DataGrid>。奇怪的错误。
安德鲁·格罗斯

12

例外

使用ItemsSource之前,Items集合必须为空。

当您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}"部分。


2
您在此处所说的内容促使我仔细研究了我的数据网格列...然后我意识到它们不在datagrid.columns标记中。+1为我带来精神上的帮助。
Craig Brett


4

就我而言,它只是ListView内的一个额外StackStack:

<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>

一切都很好。


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>

我应该感谢您4个小时,我花了很多时间来解决这个问题。谢谢
Mark

4

我的数据网格风格。如果您<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>

3

我有同样的错误。问题是在标记</ComboBox.SelectedValue>和</ ComboBox>之间错误添加了这个多余的符号“>”:

<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>

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,尤其是在您最近编辑过的地方。


2

我在另一种情况下遇到此错误。我尝试直接在中定义TreeViewItems的样式<TreeView>,但应该在中嵌入样式<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>

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>

无论如何,因此损失了半个小时。希望这对其他人有帮助。


1

我遇到了这个问题,因为<ListView.View>XAML中缺少一个特定级别的标记。

此代码产生此错误。

<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>

-1

当心错别字!我有以下

<TreeView ItemsSource="{Binding MyCollection}">
    <TreeView.Resources>
        ...
    </TreeView.Resouces>>
</TreeView>

(请注意尾部>,它被解释为内容,因此您将内容设置为两倍...花了我一段时间:)


Armentage已经提到了这一点,并提供了更多解释。
Ben Voigt 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.