「ItemsSourceを使用する前に、Itemsコレクションを空にする必要があります。」


172

この古いATC Avalonチームの記事「カスタムビューを作成する方法」で説明されているように、WrapPanelのようなスタイルのWPFリストビューに表示する画像を取得しようとしています

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のItemsコレクションに適用されるためです。そのため、XAMLは、Itemsコレクションの単一のlocal:ImageViewでListViewを初期化します。ただし、ItemsControlを使用する場合は、ItemsプロパティまたはItemsSourceプロパティのいずれかを使用する必要があります。同時に両方を使用することはできません。したがって、ItemsSource属性が処理されると、例外がスローされます。

クラスでContentPropertyAttributeを探すことにより、要素のコンテンツがどのプロパティに適用されるかを確認できます。この場合は、ItemsControlのクラス階層の上位で定義されています。

[ContentPropertyAttribute("Items")]

ここでの意図は、ListViewのビューをlocal:ImageViewに設定することでした。そのため、修正は、設定するプロパティを明示的に示すことです。

XAMLを修正すると、例外はなくなります。

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

その<ListView.View>タグがありませんでした。


6
この答えは正しいです。ただし、このケースを確認する前に、他の回答で述べたように、xamlが正しいことを確認してください。それ以外の場合は、ItemSourceなどを調べるのに多くの時間を費やすだけで、最終的には小さなタイプミスが原因であることがわかります。
pjm 2016年

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
ありがとうございました!そのような単純な問題...しかし、そのような紛らわしいエラー。
スコット

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が設定されたときに、インスタントcrashola。したがって、この問題をデバッグする場合は、ItemsControl固有のデータの子を囲むエラーだけではないことに注意してください。


4
同じことが私にも起こりました:追加>=>例外
2011

7
もちろん、これは単にそれだけではありません。誤って入力した文字は、それ自体がアイテムになります。この状態を確認するには、ItemsSource属性を一時的に削除します。それでもデータグリッドに行がある場合は、無関係な文字がないか確認する必要があります
Simon_Weaver

4
Armentage ...あなたは私を救っただけなんだ。これを投稿してくれてありがとう...投票する!
John Fairbanks

1
とても興味深い。それがコンパイルエラーではない理由がわかりません。それも私を得た!
shawn1874 2015年

1
ああ、同じエラーが発生しました:余分な「>」。ビールを買ってもいいですか。なんと奇妙なエラーであり、コンパイルエラーなしで見つけるのはどれほど難しいのでしょう。これは私の日を救った!
ビョルングロスマン

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を設定するとおかしな例外が発生しましたが、どれも正しい方向に導いてくれませんでした。
アロイスクラウス

これは、を使用するときに修正されました<ItemsControl>
RHaguiuda 2017

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>

provided <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時間、ありがとうございました。ありがとう
マーク

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>

(テーリング>に注意してください。これはコンテンツとして解釈されるため、コンテンツを2倍に設定しています...少し時間をかけてください:)


アーメンテージはすでにこれについて言及しており、もう少し説明があります。
Ben Voigt 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.