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

이 이전 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 할당하기 전에.



답변

이 특정 예외가 발생하는 이유는 요소의 내용이 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>태그 가 없습니다 .


답변

약간 다른 시나리오에서 잠시 동안 동일한 오류가 발생했습니다. 나는했다

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


답변

방금이 문제에 대한 아주 교활한 예를 보았습니다. 내 원래 조각이 훨씬 더 복잡하여 오류를 확인하기가 어려웠습니다.

   <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 특정 데이터 하위를 둘러싼 오류 이상을 찾으십시오.


답변

나도 다른 시나리오에 있습니다.

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


답변

다른 시나리오에서 동일한 오류가 발생했습니다.

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


답변

⚠️ 답변을 다르게 표시 하려면 ⚠️

? 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>^^^. ?


답변

예외

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}"부분을 ​​확인하십시오.