"ItemsSource를 사용하기 전에 항목 컬렉션이 비어 있어야합니다."


172

이 이전 ATC Avalon Team 기사 : 사용자 지정보기를 만드는 방법에 설명 된 것처럼 WrapPanel과 같은 스타일의 WPF ListView에 이미지를 표시하려고합니다 .

LINQ-to-Entities에서 쿼리 한 ADO.NET Entity Framework 개체 컬렉션으로 ListView를 채우려 고하면 다음 예외가 발생합니다.

예외

ItemsSource를 사용하기 전에 항목 컬렉션이 비어 있어야합니다.

내 코드…

비주얼 베이직

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의 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도 사용하지 않았습니다).
Dave

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가 나중에 설정되면 즉시 중단됩니다. 따라서이 문제를 디버깅 할 때 ItemsControl 특정 데이터 하위를 둘러싼 오류 이상을 찾으십시오.


4
나에게도 같은 일이 일어났다 : Extra >=> Exception
surfen dec

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>

이제 누락 된 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을 설정하면 재미있는 예외가 발생했지만 올바른 방향으로 이어지는 것은 없었습니다.
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

필자의 경우 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>

그리고 모든 것이 잘됩니다.


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>

어쨌든,이 때문에 30 분을 잃었다. 이것이 다른 사람들을 돕기를 바랍니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.