Как отобразить информацию Master-Detail в сворачиваемом ListView - PullRequest
2 голосов
/ 28 ноября 2011

У меня есть класс, который описывает определенную задачу.Этот класс «задача» имеет список подэтапов.

Я хотел показать эту информацию в ListView, где описание задачи должно использоваться как заголовок группы, а подэтапы - как детали

Также я хотел иметь возможность свернуть и расширить эти группы.

Вот то, что я пробовал до сих пор (упрощенно, но, надеюсь, вы поймете идею):

public class Task : INotifyPropertyChanged
{
   public string Description;
   public ObservableCollection<String> substeps;
   ...
}

в модели просмотра:

Task t = new Task();
t.Description = "Task1";
t.substeps.Add("substep 1");
t.substeps.Add("substep 2");
...

Tasks = new CollectionViewSource { Source = TaskList }; //TaskList is just a ObservableCollection<Task>
Tasks.GroupDescriptions.Add(new PropertyGroupDescription("Description"));

в xaml:

<s:SurfaceListBox Width="500" Height="1000" ItemsSource="{Binding TaskList.View}">
                <s:SurfaceListBox.Resources>
                    <Style x:Key="ContainerStyle" TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Expander Header="{Binding Description}" IsExpanded="True">
                                        <ItemsPresenter/>
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </s:SurfaceListBox.Resources>
                <s:SurfaceListBox.GroupStyle>
                    <GroupStyle ContainerStyle="{StaticResource ContainerStyle}"/>
                </s:SurfaceListBox.GroupStyle>
                <s:SurfaceListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding substeps}"/>
                    </DataTemplate>
                </s:SurfaceListBox.ItemTemplate>
            </s:SurfaceListBox>

Результатом является список с моим свернутым элементом.Если я расширяю его, вместо каждого шага я вижу только «(Listing)»

Нужно ли создавать класс с подэтапами и описанием в нем и группировать по описанию?

1 Ответ

1 голос
/ 29 ноября 2011

Попробуйте это:

<s:SurfaceListBox.ItemTemplate>
    <DataTemplate>
        <ItemsControl ItemsSource={Binding substeps} />
    </DataTemplate>
</s:SurfaceListBox.ItemTemplate>

Ваша проблема в том, что привязка строки к ObservableCollection просто сделает ToString() для этой коллекции. Вам нужно перебрать коллекцию и отобразить каждый элемент. Используя ItemsControl, как я уже делал, вы также можете DataTemplate каждую подзадачу по своему усмотрению.

Привязка шаблона управления

Привязка заголовка Expander не будет работать, поскольку она находится внутри ControlTemplate, которая находится внутри Style. DataContext для шаблона элемента управления будет не вашим ViewModel, а самим элементом управления (т.е. SurfaceListBox). Подобный вопрос здесь .

Есть два способа исправить это.

1.Использование DataTemplate

<s:SurfaceListBox.ItemTemplate>
    <DataTemplate>
        <Expander Header="{Binding Description}"
                  IsExpanded="True" >
            <ItemsControl ItemsSource={Binding substeps} />
        </Expander >
    </DataTemplate>
</s:SurfaceListBox.ItemTemplate>

2.Использование TemplatedParent переплет

<Expander Header="{Binding Content.Description, , RelativeSource={RelativeSource TemplatedParent}}"
          IsExpanded="True">

Я лично рекомендую вариант 1.

...