ItemSource が ObservableCollection のインスタンスである ObjectDataProvider である ListBox があります。ObservableCollection は、ObservableCollection のコレクションです。ListBox の ItemTemplate は、リストボックスの各項目の ListBox を作成する DataTemplate です。これをよりよく説明するために、WPF でカード ゲームを再作成しようとしています。基本的に、手札から本を作ることができます。有効な本を入手したら、それを本の ObservableCollection に入れる本にすることを選択できます。私が抱えている問題は、ListBox の各項目が、カードの ObservableCollection である Book である ItemSource を持つ ListBox であることです。外側の ListBox のソースやテンプレートに問題があるとは思いませんが、どうすればよいか理解するのに苦労しています。m ListBox 項目のソースを各本のカードのコレクションに設定します。基本的に、私の質問はわかりにくく、理解するのが難しい概念かもしれませんが、基本的には、別の ListBox のテンプレートになるテンプレートで ListBox を使用する方法を理解しようとしています。誰かがこれにアプローチする方法について何か考えがある場合は、聞いていただければ幸いです。
3 に答える
次のようなカードを使用します。
public class Card
{
private string _name;
public Card(string name)
{
_name = name;
}
public string Name
{
get { return _name; }
set { _name = value; }
}
}
次のように予約します。
public class Book
{
private readonly ObservableCollection<Card> _cards;
public Book(ObservableCollection<Card> cards)
{
_cards = cards;
}
public ObservableCollection<Card> Cards
{
get { return _cards; }
}
}
次に、ウィンドウに ListBox を作成します。
<ListBox
ItemsSource="{Binding ElementName=Window, Path=Books}"
ItemTemplate="{StaticResource MainListTemplate}" />
ウィンドウのリソースに次のように入力します。
<Window.Resources>
<ResourceDictionary>
<DataTemplate
x:Key="InsideListTemplate">
<TextBlock
Text="{Binding Name}" />
</DataTemplate>
<DataTemplate
x:Key="MainListTemplate">
<ListBox
ItemsSource="{Binding Cards}"
ItemTemplate="{StaticResource InsideListTemplate}" />
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
ListBox は、ListBox を含む MainListTemplate を使用します。その ListBox の ItemsSource はカードのリストであり、ItemTemplate は InsideListTemplate です。私は単純な TextBlock として持っていますが、必要なことは何でもできます。
ListBox 内に ListBox を配置しないでください。選択されたアイテムの「レベル」が複数あるため、UI が非常にわかりにくくなります。
各項目内にコレクションを持つ単一の ListBox が必要な場合は、ListBox 内に ItemsControl を配置できます。複数のリスト ボックスが必要な場合は、ItemsControl 内に ListBox を配置できます。
回答ありがとうございます。私は両方の回答に同意し、悪いコーディング慣行について通知されることを常に感謝していますが、最初の回答はうまくいきました。DataTemplate 内の ListBox の ItemsSource に問題がありました。WPF の学習のどこかで、ObjectDataProvider を ItemsSource として使用することに夢中になりました。ObjectDataProvider はコレクションのインスタンスにすぎないため、それを更新すると、すべての「本」のカードのソースは同じになります。私のItemsSourceバインディングソースを観察可能なコレクション「Cards」に直接変更すると、うまくいきました。
UI に関してはわかりにくいかもしれませんが、いずれかのリストの項目を選択できるようにするかどうかさえわかりません。私の意図は、プレーヤーの本を視覚的に表現することだけでした。カードをブックからメインハンドに移動できるようにするために、外側のリストのアイテムを選択できるようにする必要があるかもしれませんが、まだわかりません.
助けてくれてありがとう。
ありがとう、ブランドン