Bộ sưu tập các mặt hàng phải trống trước khi sử dụng ItemSource.


172

Tôi đang cố gắng để hình ảnh hiển thị trong Danh sách WPF được tạo kiểu như WrapPanel như được mô tả trong bài viết Nhóm ATC Avalon cũ này: Cách tạo Chế độ xem tùy chỉnh .

Khi tôi cố gắng điền vào ListView với bộ sưu tập LINQ-to-Entity truy vấn các đối tượng ADO.NET Entity Framework, tôi nhận được ngoại lệ sau:

ngoại lệ

Bộ sưu tập vật phẩm phải trống trước khi sử dụng ItemSource.

Mã của tôi…

Ngôn ngữ lập trình

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>

Tôi đặt một điểm dừng trên dòng đó. ListViewImages.ItemsSourceNothingngay trước khi việc chuyển nhượng LINQ.

Câu trả lời:


127

Lý do ngoại lệ cụ thể này bị ném là do nội dung của phần tử được áp dụng cho bộ sưu tập Mục của ListView. Vì vậy, XAML khởi chạy ListView với một cục bộ duy nhất: ImageView trong bộ sưu tập Mục của nó. Nhưng khi sử dụng ItemControl, bạn phải sử dụng thuộc tính Item hoặc thuộc tính ItemSource, bạn không thể sử dụng cả hai cùng một lúc. Do đó, khi thuộc tính ItemSource được xử lý, một ngoại lệ được đưa ra.

Bạn có thể tìm ra thuộc tính nào mà nội dung của một phần tử sẽ được áp dụng cho bằng cách tìm ContentPropertyAttribution trên lớp. Trong trường hợp này, nó được xác định cao hơn trong hệ thống phân cấp lớp, trên ItemControl:

[ContentPropertyAttribute("Items")]

Ý định ở đây là Chế độ xem của ListView được đặt thành cục bộ: ImageView để sửa lỗi là chỉ rõ ràng thuộc tính sẽ được đặt.

Khắc phục XAML và ngoại lệ biến mất:

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

Nó đã bị thiếu <ListView.View>thẻ đó .


6
Câu trả lời này là chính xác. Nhưng trước khi kiểm tra trường hợp này, hãy kiểm tra xem xaml của bạn có đúng như được đề cập trong các câu trả lời khác không. Nếu không, bạn có thể dành nhiều thời gian để xem vv của ItemSource để cuối cùng thấy rằng nó gây ra bởi một lỗi đánh máy nhỏ.
pjm

182

Tôi đã có cùng một lỗi trong một thời gian trong một kịch bản hơi khác nhau. Tôi đã có

<wpftoolkit:DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{Binding Path=Accounts}" >
    <wpftoolkit:DataGridTextColumn 
        Header="Account Name" 
        Binding="{Binding Path=AccountName}" />
</wpftoolkit:DataGrid>

mà tôi đã cố định là

<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
Cảm ơn bạn! Một vấn đề đơn giản như vậy ... nhưng đó là một lỗi khó hiểu.
Scott

15
Đối với tôi, sự khác biệt đơn giản là thiếu <DataGrid.Columns> (và tôi thậm chí không sử dụng wpftoolkit).
Dave

1
Thiếu <DataGrid.Columns> đối với tôi.
Eternal21

67

Tôi vừa gặp một ví dụ RẤT RẤT LỚN về vấn đề này. Đoạn ban đầu của tôi phức tạp hơn nhiều, khiến cho việc nhìn thấy lỗi trở nên khó khăn.

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

Con bọ? Thêm > sau <ItemsControl>thẻ mở ban đầu ! Đã <áp dụng cho bộ sưu tập Vật phẩm tích hợp. Khi DataContext được thiết lập sau đó, crashola ngay lập tức. Vì vậy, hãy chú ý nhiều hơn là các lỗi xung quanh các mục dữ liệu cụ thể của ItemControl của bạn khi gỡ lỗi vấn đề này.


4
Điều tương tự cũng xảy ra với tôi: Extra >=> Ngoại lệ
lướt sóng

7
tất nhiên không chỉ là> sẽ làm điều này. bất kỳ nhân vật nào vô tình gõ sẽ trở thành vật phẩm của chính họ. bạn có thể kiểm tra tình trạng này bằng cách tạm thời xóa thuộc tính ItemSource của bạn. Nếu bạn vẫn còn hàng trong lưới dữ liệu thì bạn cần kiểm tra các ký tự không liên quan
Simon_Weaver

4
Armentage ... bạn vừa cứu tôi Tôi không biết bao nhiêu giờ tìm kiếm này !!! Cảm ơn rất nhiều vì đã đăng bài này ... bỏ phiếu!
John Fairbanks

1
Rất thú vị. Tôi không chắc tại sao đó không phải là lỗi biên dịch. Nó cũng nhận được tôi!
shawn1874

1
Ôi trời, tôi đã có cùng một lỗi: Thêm ">". Tôi có thể mua cho bạn một cốc bia không? Thật là một lỗi lạ và khó tìm như thế nào nếu không có lỗi biên dịch! Điều này đã cứu ngày của tôi!
Bjorn Grossmann

40

Tôi cũng vậy trên một kịch bản khác.

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

Bây giờ khi bạn hoàn thành với thẻ Control.ItemTemplate bị thiếu , mọi thứ sẽ trở lại bình thường:

<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
Tại sao phải là WPF rất đáng sợ? Đặt DataTemplate cho ListBox gây ra các ngoại lệ buồn cười nhưng không ai trong số chúng dẫn đến hướng đúng.
Alois Kraus

Điều này cố định với tôi khi sử dụng a <ItemsControl>.
RHaguiuda

27

Tôi đã có lỗi tương tự trong một kịch bản khác

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

Giải pháp là thêm ItemsControl.ItemsPanelthẻ trướcItemsPanelTemplate

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

Đây là những gì đã khắc phục vấn đề của tôi!
RDV

14

⚠️ Để nêu câu trả lời khác ⚠️

Trong Xaml xác minh rằng không có Nút cha bị thiếu hoặc các nút không chính xác trong các khu vực được xác định.

Ví dụ

Đây là thất bại:

Không có cha mẹ thích hợp cho nút con bên dưới:ItemsPanelTemplate

<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
    <ItemsPanelTemplate>
        <UniformGrid Rows="1" />
    </ItemsPanelTemplate>
    ...
</ItemsControl>

Đây là hoạt động:

<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
    <ItemsControl.ItemsPanel> <!-- I am the missing parent! -->
        <ItemsPanelTemplate>
            <UniformGrid Rows="1" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    ...    
</ItemsControl>

Có một nút cha thích hợp <ItemsControl.ItemsPanel>được cung cấp ^^ ^ ^ . 💡


2
Điều này. Đã bị thiếu <DataGrid.Columns>và có các cột mẫu trực tiếp bên trong <DataGrid>. Lỗi lạ cho điều đó.
Andrew Grothe

12

ngoại lệ

Bộ sưu tập vật phẩm phải trống trước khi sử dụng ItemSource.

Ngoại lệ này xảy ra khi bạn thêm các mục vào ItemsSource thông qua các nguồn khác nhau . Vì vậy, hãy chắc chắn rằng bạn đã vô tình bỏ lỡ một thẻ, đặt nhầm thẻ, thêm thẻ phụ hoặc viết sai thẻ.

<!--Right-->

<ItemsControl ItemsSource="{Binding MyItems}">
     <ItemsControl.ItemsPanel.../>
     <ItemsControl.MyAttachedProperty.../>
     <FrameworkElement.ActualWidth.../>
</ItemsControl>


<!--WRONG-->

<ItemsControl ItemsSource="{Binding MyItems}">
     <Grid.../>
     <Button.../>
     <DataTemplate.../>
     <Heigth.../>
</ItemsControl>

Trong khi ItemsControl.ItemsSourceđã được đặt qua Binding, các mục khác (Lưới, Nút, ...) không thể được thêm vào nguồn. Tuy nhiên trong khi ItemsSourceđang không sử dụng đoạn mã sau được phép :

<!--Right-->
<ItemsControl>
     <Button.../>
     <TextBlock.../>
     <sys:String.../>
</ItemsControl>

nhận thấy sự thiếu ItemsSource="{Binding MyItems}"phần.


2
Một cái gì đó trong những gì bạn nói ở đây đã thôi thúc tôi xem xét kỹ các cột lưới dữ liệu của mình ... sau đó tôi nhận ra chúng không có trong thẻ datagrid.columns. +1 vì đã cho tôi chạy bộ về tinh thần.
Craig Brett


4

Trong trường hợp của tôi, nó chỉ là một StackPanel bổ sung bên trong 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>

Trở thành:

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

và tất cả đều tốt


4

Trong trường hợp của tôi, nó đã không sử dụng DataTemplate cho ItemControl.

Cũ:

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

Mới:

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

Tôi nên cảm ơn bạn 4 giờ, thời gian tôi đã dành để cố gắng sửa chữa mớ hỗn độn này ... CẢM ƠN BẠN
Đánh dấu

4

Của tôi là với một phong cách datagrid. Nếu bạn bỏ qua các <DataGrid.RowStyle>thẻ xung quanh Kiểu bạn sẽ gặp vấn đề đó. Điều kỳ lạ là nó đã làm việc trong một thời gian như thế. Đây là mã xấu.

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

và tốt

 <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

Tôi đã có những lỗi giống nhau. Vấn đề là biểu tượng phụ này ">" được thêm vào do nhầm lẫn giữa các thẻ </ComboBox.SelectedValue> và </ ComboBox>:

<ComboBox 
   ItemsSource="{Binding StatusTypes}"
   DisplayMemberPath="StatusName"
   SelectedValuePath="StatusID">
   <ComboBox.SelectedValue>
      <Binding Path="StatusID"/>
   </ComboBox.SelectedValue>
   >
</ComboBox>

và đây là mã chính xác:

<ComboBox 
   ItemsSource="{Binding StatusTypes}"
   DisplayMemberPath="StatusName"
   SelectedValuePath="StatusID">
   <ComboBox.SelectedValue>
      <Binding Path="StatusID"/>
   </ComboBox.SelectedValue>
</ComboBox>

2

Tôi đã gặp lỗi này khi tôi thử áp dụng các menu ngữ cảnh cho tôi TreeView. Những lần thử đó đã kết thúc bằng một XAML tồi được biên dịch bằng cách nào đó:

<TreeView Height="Auto" MinHeight="100"  ItemsSource="{Binding Path=TreeNodes, Mode=TwoWay}" 
    ContextMenu="{Binding Converter={StaticResource ContextMenuConverter}}">
    ContextMenu="">
    <TreeView.ItemContainerStyle>
    ...  

Lưu ý dòng có vấn đề : ContextMenu="">.
Tôi không biết tại sao nó được biên dịch, nhưng tôi nghĩ rằng nó đáng được đề cập như là một lý do cho thông điệp ngoại lệ khó hiểu này. Giống như Armentage đã nói, hãy nhìn xung quanh XAML một cách cẩn thận, đặc biệt là ở những nơi bạn đã chỉnh sửa gần đây.


2

Tôi gặp phải lỗi này trong một tình huống khác. Tôi đã cố gắng xác định một kiểu cho TreeViewItems trực tiếp trong <TreeView>, nhưng thay vào đó nên nhúng nó vào trong<TreeView.ItemContainerStyle> .

Sai lầm:

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

Chính xác:

<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

Có lẽ không phải là một câu trả lời hữu ích, nhưng tôi đã gặp vấn đề tương tự khi thay đổi thứ tự cột và mắc lỗi giống như trong mẫu sau. Có rất nhiều cột, tôi sắp xếp lại chúng và bằng cách nào đó dán một cột sau khi đóng thẻ /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>

Dù sao, mất nửa giờ vì điều này. Hy vọng điều này sẽ giúp những người khác.


1

Tôi gặp vấn đề này vì một cấp độ của thẻ, <ListView.View> thể là, đã bị thiếu trong XAML của tôi.

Mã này tạo ra lỗi này.

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

Sau đây đã sửa nó

<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

Coi chừng lỗi chính tả! Tôi đã có những điều sau đây

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

(Lưu ý phần đuôi > , được hiểu là nội dung, vì vậy bạn đang đặt hai lần nội dung ... Mất một lúc :)


Armentage đã đề cập đến điều này, với một chút giải thích.
Ben Voigt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.