2011-01-31 3 views
2

Я новичок в WPF и MVVM. В моей ViewModel У меня есть коллекция предметов, например:Выбор правильного управления списком позиций

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

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

Title1 
Title2 
Title3 

If пользователь нажимает на одну из заголовка она будет расширяться, чтобы показать описание, например:

Title1 
Description1 
Title2 
Title3 

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

Title1 
Description1 
Title2 
Description2 
Title3 

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

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

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

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

ответ

6

Если вам не требуется выбор, вы должны пойти с 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

Не могли бы вы рассказать мне, как я могу привязать видимость содержимого к 'ToggleButton.IsPressed'? – prostynick

+0

Это 'IsChecked', смешанный; вы можете использовать 'BooleanToVisibilityConverter' для этого. –

+0

Вы можете просто использовать встроенный элемент управления расширителя в своем DataTemplate ... –

0

Я хотел бы подойти к этому с ListBox и имеют ListBox.SelectionMode="Multiple" в нем. На ItemcontainerStyle у вас может быть триггер в ListBox.IsSelected, чтобы он был расширен.

Смежные вопросы