2008-12-08 2 views
1

У меня есть ListBox, чей ItemSource является ObjectDataProvider, который является экземпляром ObservableCollection. ObservableCollection - это коллекция ObservableCollections. ItemTemplate ListBox - это DataTemplate, который создает ListBox для каждого элемента списка. Чтобы проиллюстрировать это лучше, я пытаюсь воссоздать карточную игру в WPF. В принципе, из рук карт вы можете создавать книги. После того, как у вас есть действующая книга, вы можете выбрать книгу, которая войдет в ObservableCollection of Books. Проблема, с которой я столкнулась, состоит в том, что каждый элемент ListBox является ListBox, у которого есть ItemSource, который является Книгой, то есть ObservableCollection of Cards. Я не думаю, что у меня проблема с источником или шаблоном внешнего ListBox, но мне трудно понять, как я собираюсь установить источник элементов ListBox в коллекцию карт для каждый книга. По сути, мой вопрос может быть запутанным и сложным понятием, но по сути я пытаюсь понять, как использовать ListBox в шаблоне, который станет шаблоном другого ListBox. Если кто-нибудь знает, как подойти к этому, я был бы очень признателен за это.WPF: используйте ListBox в шаблоне, который будет шаблоном другого ListBox

ответ

4

С карты, как следующее:

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 используется MainListTemplate, который содержит ListBox. Элемент ItemsSource для этого ListBox - это ваш список карт, а ItemTemplate - это InsideListTemplate. У меня это как простой TextBlock, но вы можете делать все, что вам нужно.

2

Не помещайте ListBox внутри ListBox, это создаст очень запутанный интерфейс, потому что у вас будет несколько «уровней» выбранных элементов.

Вы можете поместить элемент ItemsControl внутри ListBox, если вам нужен один ListBox с коллекцией внутри каждого элемента или ListBox внутри элемента ItemsControl, если вам нужно несколько списков.

0

Благодарим за ответы. Хотя я согласен с обоими ответами и всегда ценю, что меня уведомляют о плохой практике кодирования, первый ответ сделал трюк. У меня возникла проблема с ItemsSource ListBox в моей DataTemplate. Где-то по пути обучения WPF я стал подключаться к ObjectDataProvider (s) как к элементу ItemsSource. Поскольку ObjectDataProvider был только экземпляром коллекции, и когда я обновляю его, источником карточек для всех моих «Книг» будет то же самое. Изменение моего источника привязки ItemsSource непосредственно к наблюдаемой коллекции «Карты» сделало трюк.

Хотя это может быть запутанным в отношении пользовательского интерфейса, я не уверен, что я собираюсь даже разрешить выбор элементов в любом из списков. Мои намерения были просто для визуального представления книг игроков. Мне может потребоваться, чтобы элементы внешнего списка были выбраны, чтобы переместить карты из книги и обратно в основную руку, но я пока не уверен.

Еще раз спасибо за помощь.

Thanks, Brandon