Как добавить элемент после привязки данных?

1

Я пытаюсь привязать некоторые данные к gridview, а затем добавить кнопку в конце (аналогично приложению MSN Finance в Windows 8).

Как я могу это достичь?

Мой текущий код xaml:

            <DataTemplate>
                <GridView
                    x:Name="StopGridViewItem"
                    ItemsSource="{Binding}"
                    Margin="0,0,20,20"
                    AutomationProperties.AutomationId="ItemGridView"
                    AutomationProperties.Name="Items In Group"
                    ItemTemplate="{StaticResource Standard310x260ItemTemplate}"
                    SelectionMode="None"
                    IsSwipeEnabled="false"
                    IsItemClickEnabled="True" ItemClick="StopGridViewItem_ItemClick">
                </GridView>


            </DataTemplate>

Изображение 174551

Заранее спасибо!

Теги:
xaml

2 ответа

1
Лучший ответ

Существует много способов справиться с этим сценарием.

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

<DataTemplate>
    <StackPanel>
        <ItemsControl
            x:Name="StopGridViewItem"
            ItemsSource="{Binding}"
            ItemTemplate="{StaticResource Standard310x260ItemTemplate}">
        </ItemsControl>

        <Button ... />
    </StackPanel>
</DataTemplate>

Если вам нужно поддерживать прокрутку или иметь дело с элементом управления, который не может просто нажимать кнопку дальше вниз, как мозаику, вам нужно добавить фиктивный элемент внутри коллекции, которую вы связываете с вашим списком. Если виртуализация списка не является проблемой, вы можете просто добавить ее в конце своей коллекции внутри конвертера. Если вам нужно поддерживать виртуализацию, то это не решение. Для обработки этого случая вам понадобится специальный элемент управления.

Наконец, как только фиктивный элемент вставлен в список, вы можете использовать DataTemplateSelector для переключения между вашим обычным шаблоном и вашим фиктивным шаблоном при создании элемента в представлении.

public static class EnumerableExtensions
{
    public static IEnumerable Append(this IEnumerable source, object o)
    {
        foreach (var x in source)
        {
            yield return x;
        }

        yield return o;
    }
}

public class DummyInserter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var source = value as IEnumerable;
        if (source == null)    throw new UnsupportedException("DummyInserter converter requires an IEnumerable source");

        return source.Append(new Dummy()).ToArray();
    }
}

И для XAML:

<Resources>
    <DummyInserter x:key="AddButtonDummyInserter" />
    <DummyTemplateSelector x:key="MySelector"
                           DefaultTemplate="{StaticResource Standard310x260ItemTemplate}"
                           DummyTemplate="{StaticResource 310x260AddButtonTemplate}" />
</Resources>

<DataTemplate>
    <StackPanel>
        <ItemsControl
            x:Name="StopGridViewItem"
            ItemsSource="{Binding, Converter={StaticResource AddButtonDummyInserter}}"
            ItemTemplateSelector="{StaticResource MySelector}">
        </ItemsControl>

        <Button ... />
    </StackPanel>
</DataTemplate>
1

Добавьте его в ObservableCollection<T> того, с чем GridView ItemsSource GridView.


Если Footer и GridRow недостаточно. Тогда вы можете сделать это более сложным способом, используя ItemTemplateSelector

<Page.Resources>
    <DataTemplate x:Key="AddTemplate">
        <Button Command="{Binding}" Content="{Binding Title}" Height="100" MinHeight="100" Width="100" MinWidth="100"/>
    </DataTemplate>
    <DataTemplate x:Key="DefaultTemplate">
        <Border BorderThickness="1" BorderBrush="Red">
            <StackPanel Height="100" MinHeight="100" Width="100" MinWidth="100">
                <TextBlock Text="{Binding Artist}"></TextBlock>
                <TextBlock Text="{Binding Song}"></TextBlock>
            </StackPanel>
        </Border>
    </DataTemplate>
    <local:MyTemplateSelector x:Key="MyTemplateSelector" AddTemplate="{StaticResource AddTemplate}" DefaultTemplate="{StaticResource DefaultTemplate}"></local:MyTemplateSelector>
</Page.Resources>

<GridView x:Name="myGV" ItemTemplateSelector="{StaticResource MyTemplateSelector}"></GridView>        

public class MyTemplateSelector : DataTemplateSelector
{
    public DataTemplate AddTemplate { get; set; }

    public DataTemplate DefaultTemplate { get; set; }


    protected override Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container)
    {
        if (item is sample_model)
        {
            return DefaultTemplate;
        }
        else
        {
            return AddTemplate;
        }
    }
}

В основном вы можете добавить столько models сколько хотите в GridView.Items, все, что он делает, это проверить, какой тип модели он есть, если это sample_model (ваша модель), он будет использовать шаблон по умолчанию, но если это не по умолчанию, то он использует AddTemplate (который является кнопкой один)

Пример вывода с использованием sample_model (Artrist/Song) и нестандартной модели с использованием только свойства Title

Изображение 174551

  • 0
    Но что, если предмет не совпадает с другими предметами? Например, кнопка «+» вместо стандартного набора данных
  • 0
    @Forever, узнав, что кнопка «+» не является частью ItemTemplate, она является частью <GridView.FooterTemplate></GridView.FooterTemplate> msdn.microsoft.com/en-us/library/… (так что в основном это элемент, который вы можете всегда иметь в конце списка, со своей привязкой / шаблоном)
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню