WPF: используйте ListBox в шаблоне, который будет шаблоном другого ListBox - PullRequest
1 голос
/ 08 декабря 2008

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

Ответы [ 3 ]

4 голосов
/ 09 декабря 2008

с картой, как показано ниже:

 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 голосов
/ 09 декабря 2008

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

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

0 голосов
/ 09 декабря 2008

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

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

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

Спасибо, Brandon

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...