Подтвердить что ты не робот

Как заставить группы в Metro GridView использовать разные макеты?

Я пишу приложение Windows 8 Metro. Я пытаюсь рисовать GridView с тремя группами. Я хочу, чтобы одна из этих групп могла расставить свои элементы по-другому, чем другие. Я использовал Селекторы раньше в WPF, поэтому я думал, что это будет хороший маршрут. Поэтому я попробовал GroupStyleSelector, и я нашел этот пример в MSDN:

public class ListGroupStyleSelector : GroupStyleSelector
{
  protected override GroupStyle SelectGroupStyleCore(object group, uint level)
  {
    return (GroupStyle)App.Current.Resources["listViewGroupStyle"];
  }
}

Итак, я изменил/расширил его из чего-то, что мне подойдет:

CS:

public class ExampleListGroupStyleSelector : GroupStyleSelector
{
  public ExampleListGroupStyleSelector ()
  {
     OneBigItemGroupStyle = null;
     NormalGroupStyle = null;
  }

  public GroupStyle OneBigItemGroupStyle { get; set; }
  public GroupStyle NormalGroupStyle { get; set; }

  protected override GroupStyle SelectGroupStyleCore( object group, uint level )
  {
     // a method that tries to grab an enum off the bound data object
     var exampleListType= GetExampleListType( group );

     if ( exampleListType== ExampleListType.A)
     {
        return OneBigItemGroupStyle;
     }
     if ( exampleListType== ExampleListType.B|| exampleListType== ExampleListType.B)
     {
        return NormalGroupStyle;
     }

     throw new ArgumentException( "Unexpected group type" );
  }
}

XAML:

<Page.Resources>
  <ExampleListGroupStyleSelector 
     x:Key="ExampleListGroupStyleSelector"
     OneBigItemGroupStyle="{StaticResource OneBigGroupStyle}"
     NormalGroupStyle="{StaticResource NormalGroupStyle}" />
</Page.Resources>
<GridView
     ItemsSource="{Binding Source={StaticResource exampleListsViewSource}}"
     GroupStyleSelector="{StaticResource ExampleListGroupStyleSelector}">
     <GridView.ItemsPanel>
        <ItemsPanelTemplate>
           <VirtualizingStackPanel
              Orientation="Horizontal" />
        </ItemsPanelTemplate>
     </GridView.ItemsPanel>
</GridView>

Но группа, которую я задал в селекторе, имеет значение null или объект DependencyObject, который я, похоже, не могу удалить. Как я должен принять разумное решение о том, как изменить GroupStyle, если мне не предоставлена ​​какая-либо информация. Есть ли способ передать свойство через прикрепленное свойство или что-то в этом роде?

4b9b3361

Ответ 1

Основываясь на этом форуме thread, вы можете извлечь объект, отправив его в ICollectionView и получив доступ к свойству .Group, где вы получите объект, которому вы привязали группу. Это позволяет принимать интеллектуальные решения по шаблону. Однако он по-прежнему не работает для меня (или других людей в потоке), поскольку применяется только один стиль, несмотря на то, что возвращаются разные стили.

Изменить: Оказывается, GroupTemplate не предназначен для создания разных групп. Он предназначен для изменения вида группы, например, при просмотре или похожих случаях, когда все группы меняются.