我试图将一些数据绑定到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>
提前致谢!
答案 0 :(得分:1)
将其添加到ObservableCollection<T>
GridView
绑定到的任何内容的ItemsSource
。
如果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(这是一个按钮)
使用(Artrist / Song)的sample_model和仅具有Title
属性的非默认模型的示例输出
答案 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>