“ การรวบรวมรายการจะต้องว่างเปล่าก่อนที่จะใช้ ItemsSource”


172

ฉันพยายามที่จะได้รับภาพที่จะแสดงผลใน WPF ListView สไตล์เช่น WrapPanel ที่อธิบายไว้ในบทความเก่า ATC รีสอร์ตทีมนี้: วิธีการสร้างมุมมองที่กำหนดเอง

เมื่อฉันพยายามที่จะเติม ListView ด้วยคอลเลกชันสอบถาม LINQ-to-Entities ของวัตถุ ADO.NET Entity Framework ฉันได้รับข้อยกเว้นดังต่อไปนี้:

ข้อยกเว้น

การรวบรวมรายการจะต้องว่างเปล่าก่อนที่จะใช้ 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>

ฉันใส่จุดพักบนบรรทัดนั้น ListViewImages.ItemsSourceเป็นNothingเพียงก่อนการมอบหมาย LINQ

คำตอบ:


127

เหตุผลที่ข้อยกเว้นนี้เกิดขึ้นเนื่องจากเนื้อหาขององค์ประกอบได้ถูกนำไปใช้กับคอลเลกชันรายการของ ListView ดังนั้น XAML จะเริ่มต้น ListView ด้วยโลคัลเดียว: ImageView ในคอลเล็กชันรายการ แต่เมื่อใช้ไอเท็ม ItemsControl คุณต้องใช้คุณสมบัติไอเท็มหรือคุณสมบัติไอเท็มแหล่งข้อมูลคุณไม่สามารถใช้ทั้งสองอย่างพร้อมกันได้ ดังนั้นเมื่อแอตทริบิวต์ ItemsSource ได้รับการประมวลผลจะถูกโยนทิ้ง

คุณสามารถค้นหาคุณสมบัติขององค์ประกอบขององค์ประกอบที่จะนำไปใช้โดยค้นหา ContentPropertyAttribute บนชั้นเรียน ในกรณีนี้มันถูกกำหนดไว้ในลำดับชั้นของคลาสที่สูงกว่าบน ItemsControl:

[ContentPropertyAttribute("Items")]

ความตั้งใจที่นี่คือการที่มุมมอง ListView ถูกตั้งค่าเป็นท้องถิ่น: ImageView ดังนั้นการแก้ไขคือการระบุคุณสมบัติที่จะตั้งอย่างชัดเจน

แก้ไข XAML และข้อยกเว้นหายไป:

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

<ListView.View>แท็กนั้นหายไป


6
คำตอบนี้ถูกต้อง แต่ก่อนตรวจสอบกรณีนี้ตรวจสอบว่า xaml ของคุณถูกต้องตามที่ระบุไว้ในคำตอบอื่น ๆ มิฉะนั้นคุณสามารถใช้เวลามากมายในการดูที่รายการของแหล่งข้อมูลเท่านั้นในที่สุดก็พบว่ามันเกิดจากการพิมพ์ผิดขนาดเล็ก
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> ให้ฉันด้วย
Eternal21

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 ถูกตั้งค่าในภายหลัง crashola ทันที ดังนั้นระวังมากกว่าข้อผิดพลาดล้อมรอบ ItemsControl ข้อมูลเฉพาะเด็กเมื่อแก้จุดบกพร่องปัญหานี้


4
สิ่งเดียวกันนั้นเกิดขึ้นกับฉัน: Extra >=> Exception
surfen

7
แน่นอนมันไม่ใช่แค่> ที่จะทำเช่นนี้ อักขระที่พิมพ์โดยไม่ตั้งใจจะกลายเป็นรายการด้วยตนเอง คุณสามารถตรวจสอบเงื่อนไขนี้ได้โดยการลบแอตทริบิวต์ ItemsSource ของคุณชั่วคราว หากคุณยังคงมีแถวในตารางข้อมูลดังนั้นคุณจำเป็นต้องตรวจสอบอักขระภายนอก
Simon_Weaver

4
Armentage ... คุณเพิ่งช่วยฉันฉันไม่รู้ว่าจะหาสิ่งนี้ได้กี่ชั่วโมง !!! ขอบคุณมากสำหรับการโพสต์ ... ลงคะแนน!
John Fairbanks

1
น่าสนใจมาก. ฉันไม่แน่ใจว่าทำไมถึงไม่ใช่ข้อผิดพลาดในการคอมไพล์ มันทำให้ฉันเหมือนกัน!
shawn1874

1
โอ้ฉันมีข้อผิดพลาดเดียวกัน: พิเศษ ">" ฉันซื้อเบียร์ให้คุณได้ไหม ช่างเป็นข้อผิดพลาดที่แปลกและหายากแค่ไหนหากไม่มีข้อผิดพลาดในการคอมไพล์! สิ่งนี้ช่วยชีวิตฉันไว้!
Björn Grossmann

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>

ตอนนี้เมื่อคุณเสร็จสิ้นด้วยการควบคุมแท็กที่หายไป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 เหี้ยอย่างไม่เกรงกลัว? การตั้งค่า DataTemplate สำหรับกล่องรายการเป็นสาเหตุให้เกิดข้อยกเว้นที่ตลก แต่ไม่มีสิ่งใดนำไปสู่ทิศทางที่ถูกต้อง
Alois Kraus

<ItemsControl>นี้ได้รับการแก้ไขให้ฉันเมื่อใช้
RHaguiuda

27

ฉันมีข้อผิดพลาดเดียวกันนี้ในสถานการณ์อื่น

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

นี่คือสิ่งที่แก้ไขปัญหาของฉัน!
RDV

14

⚠️ เพื่อระบุคำตอบต่าง ๆ ⚠️

💡 ใน 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>

💡มีโหนดพาเรนต์ที่ถูกต้องซึ่ง<ItemsControl.ItemsPanel>ให้ ^^^ 💡


2
นี้. ที่ขาดหายไปและมีคอลัมน์แม่แบบโดยตรงภายใน<DataGrid.Columns> <DataGrid>ข้อผิดพลาดแปลกสำหรับที่
Andrew Grothe

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}"ส่วนที่หายไป


2
บางสิ่งในสิ่งที่คุณพูดที่นี่กระตุ้นให้ฉันดูคอลัมน์กริดข้อมูลของฉันอย่างหนักนาน ๆ ... จากนั้นฉันก็รู้ว่าพวกเขาไม่ได้อยู่ในแท็ก datagrid.columns +1 ที่ให้ฉันเขย่าเบา ๆ
Craig Brett


4

ในกรณีของฉันมันเป็นเพียง StackPanel พิเศษภายใน ListView:

<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

ในกรณีของฉันมันไม่ได้ใช้ DataTemplate สำหรับ ItemsControl

เก่า:

<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 หากคุณออกจาก <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>ที่เป็น specirfic หายไปใน 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.