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

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

我将如何实现这一目标?

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

在这里输入图像说明

提前致谢!

Solutions Collecting From Web of "数据绑定后如何添加项目?"

处理这种情况有很多种方法。

如果您正在处理一个简单的列表,而不是像我们在屏幕截图右侧看到的动态镶嵌,则可以简单地在列表后面放置一个按钮,使其看起来像列表中的一个项目。 当处理不自动滚动的列表并且是语义最好的解决方案时,这非常有效。

 <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> 

把它添加到ObservableCollection<T> ,无论GridViewItemsSource绑定到什么地方。


如果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属性的非默认模型

在这里输入图像说明