WPF: используйте ListBox в шаблоне, который будет шаблоном другого ListBox

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


person BrandonS    schedule 08.12.2008    source источник


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

person Donnelle    schedule 09.12.2008

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

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

person Nir    schedule 09.12.2008

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

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

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

Спасибо, Брэндон

person BrandonS    schedule 09.12.2008