2015-02-12 5 views
2

Я хочу иметь иерархическое отображение моих элементов.XAML Windows Store иерархический вид

Мои элементы к примеру, глядя, как этот псевдо-класс:

public class ListItem 
{ 
    public string Title {get; set;} 
    public ObservableCollection<ListItem> Children {get; set;} 
} 

И я хочу, чтобы они отображались как это:

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

Как добиться этого в приложениях XAML и Windows Store? (Я видел this на Stackoverflow, но это позволяет мне только иметь 2 уровней)

редактировать: Я также посмотрел на TreeView в XAML Toolkit, но я не нашел способ отключить «расширения-коллапс» ,

+0

Какой код вы уже пробоировали? См. [Какие темы можно задать здесь?] (Http://stackoverflow.com/help/on-topic), [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how -to-ask) и [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). – Makyen

+0

Привет! Я не пробовал много, потому что не знаю, с чего начать. Я попробовал XAML Toolkit TreeView, но я не мог отключить разворот/сбой. Теперь мой единственный подход - собрать всю иерархию и подсчитать глубину текущего элемента и привязать маржу к этой глубине - но это не очень хорошее решение, и производительность будет плохой. –

ответ

0

Спасибо за ваши ответы! Я нашел решение, которое соответствует моим потребностям.

Я следил за этим и сортировал мой список в правильном порядке. Затем я написал конвертер LevelToMargin, который преобразует уровень элемента в поле. Например:

Уровень 0 -> Margin: 0
Уровень 1 -> Маржа: 20
Уровень 2 -> Маржа: 40
...

LevelToMargin-конвертер:

public class LevelToMarginConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     var v = (value as int?)*20; 
     return new Thickness(System.Convert.ToDouble(v),0, 0, 0); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     var t = value is Thickness ? (Thickness) value : new Thickness(); 
     return t.Left/20; 
    } 
} 

Затем я связать мой уровень к краю ListItem

<DataTemplate x:Key="GradingCriteriaListDataTemplate" 
       x:Name="GradingCriteriaListDataTemplate"> 
    <Grid Width="400"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <Border Padding="5,5,5,5" 
       Background="#eaeaea" 
       BorderBrush="Black" 
       Margin="{Binding Level, Converter={StaticResource LevelToMarginConverter}}" 
       Grid.Column="0"> 

      <Border Margin="15,5,5,5" 
        Height="50" 
        VerticalAlignment="Stretch" 
        BorderBrush="Yellow" 
        BorderThickness="10,0,0,0"> 
       <StackPanel Margin="20,0,0,0"> 
        <TextBlock FontWeight="Bold" 
           Text="{Binding Name}" /> 
       </StackPanel> 
      </Border> 
     </Border> 
    </Grid> 
</DataTemplate> 

Это работает для меня :)

1

Лучший способ борьбы с этим - использовать ListView и DataTemplateSelector вместе с обертками. Мое предложение - у вас будет класс, который представляет каждый элемент в ListView. Чем в DataTemplateSelector вы можете выбрать на основе типа класса, который входит в Шаблон Селектор, что делать и какой xaml/custom control использовать для каждого элемента. Чем вы можете указать поведение как скрытие или показ по щелчку для каждого элемента. здесь msdn о том, как его использовать (его почти то же самое для ListView и для GridView)

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