如何在数据绑定后添加项目?

时间:2014-11-13 21:00:37

标签: c# windows xaml

我试图将一些数据绑定到gridview,然后在最后有一个按钮(类似于Windows 8上的MSN Finance应用程序)。

我将如何实现这一目标?

我当前的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>

enter image description here

提前致谢!

2 个答案:

答案 0 :(得分:1)

将其添加到ObservableCollection<T> GridView绑定到的任何内容的ItemsSource


如果FooterGridRow不够。然后,您可以使用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(这是一个按钮)

使用(Artrist / Song)的sample_model和仅具有Title属性的非默认模型的示例输出

enter image description here

答案 1 :(得分: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>