1. ホーム
  2. .net

[解決済み] "ItemsSourceを使用する前に、Itemsコレクションを空にする必要があります。"

2022-02-06 13:08:24

質問

ATC Avalon Teamの古い記事にあるように、WrapPanelのようにスタイルされたWPF ListViewに画像を表示させようとしています。 カスタムビューの作成方法 .

ADO.NET Entity FrameworkオブジェクトのLINQ-to-EntitiesクエリーされたコレクションをListViewに入力しようとすると、次の例外が発生します。

例外

アイテムコレクションを空にする必要があります。 を使用します。

私のコード...

ビジュアルベーシック

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.ItemsSourceNothing をLINQに代入する直前です。

どのように解決するのですか?

この例外が発生する理由は、要素のコンテンツがListViewのItemsコレクションに適用されるからです。 そのため、XAMLではListViewを初期化する際に1つの local:ImageView その中の Items コレクションを作成します。 しかし、ItemsControlを使用する場合は、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> タグを使用します。