Выбор правильного контроля для списка предметов - PullRequest
2 голосов
/ 31 января 2011

Я новичок в WPF и MVVM.В моем ViewModel у меня есть коллекция элементов, например:

class Item {
    string Title {get; set;}
    string Description {get; set;}
}

Я хотел бы создать представление, поэтому в начале у меня будет:

Title1
Title2
Title3

Если пользовательщелкните по одному из заголовков, чтобы развернуть его, чтобы отобразить описание, например:

Title1
Description1
Title2
Title3

Если пользователь щелкнет по другому заголовку, появятся два расширенных элемента:

Title1
Description1
Title2
Description2
Title3

Это, вероятно, оченьпохож на Expander контроль, и, возможно, я мог бы использовать его, но я делаю это другим способом, чтобы узнать что-то новое.

Какой контроль я должен использовать для этой цели?Должно ли это быть ItemsControl или, может быть, ListBox?

Я полагаю, что если я использую ItemsControl, я, вероятно, должен расширить свой класс Item, чтобы иметь что-то вроде bool IsExpanded и связать видимость элемента пользовательского интерфейсак этому значению.Но, возможно, я мог бы использовать ListBox и каким-то образом связать видимость элемента пользовательского интерфейса с ... Да, с чем?:)

Как я мог сделать такую ​​простую вещь?

Ответы [ 2 ]

6 голосов
/ 31 января 2011

Если вам не нужен выбор, вы должны использовать ItemsControl, чтобы добиться расширения, вы можете определить такое поведение в DataTemplate из ItemsControl, вы просто создадите легкий Expander.Принцип состоит в том, чтобы иметь ToggleButton и связывать видимость контента с его IsChecked свойством.

<ItemsControl ItemsSource="{Binding Data}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <DataTemplate.Resources>
                <BooleanToVisibilityConverter x:Key="B2VConv"/>
            </DataTemplate.Resources>
            <StackPanel Orientation="Vertical">
                <ToggleButton x:Name="tbutton" Content="{Binding Title}">
                    <ToggleButton.Template>
                        <ControlTemplate TargetType="ToggleButton">
                            <ContentPresenter/>
                        </ControlTemplate>
                    </ToggleButton.Template>
                    <ToggleButton.ContentTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding}"/>
                        </DataTemplate>
                    </ToggleButton.ContentTemplate>
                </ToggleButton>
                <TextBlock Text="{Binding Description}"
                           Visibility="{Binding ElementName=tbutton, Path=IsChecked,Converter={StaticResource B2VConv}}">
                </TextBlock>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
0 голосов
/ 01 февраля 2011

Я бы подошел к этому с ListBox и имел бы ListBox.SelectionMode="Multiple".В ItemcontainerStyle у вас может быть триггер в ListBox.IsSelected для его расширения.

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