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