web-dev-qa-db-ja.com

WPF:すべてのアイテムを表示したくないので、ItemsControlを使用せずに、コレクション内の1つのアイテムのみにバインドする方法

アイテムのコレクション(ObservableCollection)があるというこの要件がありますが、最初のアイテムのみを表示します。この要件は、ほとんどの場合、コレクションには1つのアイテムしか含まれないという事実から来ています。また、スペースの制限により、コレクションに複数のアイテムがある場合でも、アイテムの数、最初のアイテムの詳細(以前の状況と同じプレゼンテーション)、および...を表示しますより多くのアイテムがあることをユーザーに示す記号。そして、マウスがUI要素の上にあるとき、ポップアップは最終的にすべてのアイテムを表示します。

私が考えることができる最初の解決策(より良い場合は他の人に提案してください)は、このコレクションにバインドし(ItemsControlを使用しないで)、DataTemplateSelector派生クラスを定義することです(いずれかを返す) DataTemplateは、1つのアイテムのみを表示するか、DateTemplate...があり、コレクション内のアイテムの数に基づいて詳細のポップアップが表示されます。 ContentTemplateSelector

しかし、私の質問:DataTemplateの両方がXAMLでどのように表示され、コレクションの最初の項目のみを表示できるようになるのでしょうか。もちろん、ItemsControlは使えません。

更新:

今、私はそれを機能させることができ、この質問を閉じることができることに同意しています(すでにいくつかの回答があるため、これ以上削除することはできません)。

コレクション内の特定のアイテムにバインドする方法は実際にはわかっていましたが、ここで混乱することはありませんでした。ある答えが示唆するように、ContentControlを使用するべきだと感じました。しかし、(単一のインデックス付きアイテムではなく)コレクション全体にバインドし、DataTemplateSelectorを使用してコレクション内のアイテムの数に基づいて適切なDataTemplateを選択する必要があるため、私は考えました。コードは次のようになります。

<ContentControl Content="{Binding MyCollection}"
          ContentTemplateSelector="{StaticResource MyTemplateSelector}" />

また、MyTemplateSelectorでは、コレクションがリソースとして定義されており、MyCollectionの情報がないため、コレクションへの参照がないため、使用方法がわかりませんでした。ただし、非常に単純であることが判明し、DataTemplateは名前やその他の参照を知らなくてもインデックス付きアイテムを参照できます。単にこのように:

<DataTemplate>
   <TextBlock Text="{Binding [0].PropertyName}" />
<DataTemplate />
16
tete

コレクションから1つのアイテムのみにバインドするには、次の構文を使用できます。

{Binding Items[0]}

または、コレクションから単一のアイテムのプロパティにバインドするには:

{Binding Items[0].Property}

プロパティパス構文の詳細については、リンクされたページのMSDNの Binding.Path Property ページをご覧ください。

•プロパティのインデクサーは、インデクサーが適用されるプロパティ名に続く角括弧内に指定できます。たとえば、節Path=ShoppingCart[0]は、プロパティの内部インデックスがリテラル文字列「0」を処理する方法に対応するインデックスにバインディングを設定します。複数のインデクサーもサポートされています。

28
Sheridan

これを試して

<ContentControl Content="{Binding YourCollection[0]}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"></TextBlock>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>
9
Nitesh

さて、パーティーに遅れましたが、とにかく2セントを共有したいと思いました。プレゼンテーションのニーズにより近い(XAML-)表示とビューモデルを使用する方がよいでしょう。

翻訳済み:既存のビューモデル(または生データ)とそのアイテムのコレクションを直接ビューにマッピングする代わりに、_YourItemViewModel FirstItem_プロパティや_bool HasMore_プロパティ。この2番目のビューモデルは、適切に動作することを確認するために簡単に単体テストを実行でき、ビュー内でテストが難しい問題を回避するために、ロジックが少ないビューに簡単にマップできます。

3
superjos