有很多很多方法可以处理这种情况。
如果您正在处理一个简单的列表,而不是像我们在屏幕截图右侧看到的那样的动态马赛克,您可以简单地在列表后面放置一个按钮,使其看起来像你的清单。当您处理不自动滚动的列表并且是最符合语义的解决方案时,这非常有效。
<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>