限制Items控件中显示的行数

时间:2010-01-27 19:17:43

标签: wpf binding wpf-controls itemscontrol

是否有办法限制在items控件中显示的行数。 ?

我有一个可观察的字符串集合,它们绑定到Items控件。我想限制显示的行数只有一个。该集合可以有多个。

谢谢,

7 个答案:

答案 0 :(得分:2)

假设您的ItemsSource设置为MyObservableCollection

那么,如果您更改ItemsSource以使其指向MyOneItemCollection,该怎么办?

然后,只需使用LINQ做这样的事情:

using System.Linq;
MyOneItemCollection = MyObservableCollection.First();

using System.Linq;
MyOneItemCollection = MyObservableCollection.Single(item => item.Id = MyId);

答案 1 :(得分:2)

您可以使用IValueConverter

public class ItemsLimiter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        int count;
        if (Int32.TryParse((string)parameter, out count))
        {
            return ((IEnumerable<object>)value).Take(count);
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return null;
    }
}

在XAML中你可以像这样使用它:

<ItemsControl ItemsSource="{x:Bind Data, Converter={StaticResource ItemsLimiter}, ConverterParameter=12}">

答案 2 :(得分:1)

如果您只需要显示一个项目,则可以使用ContentControl显示第一个项目,而不是使用相同的可用模板选项:

<ContentControl DataContext="{erm:Items FieldName}" Content="{Binding [0]}">
    <DataTemplate>
        <TextBlock Text="{Binding}" TextWrapping="Wrap" FontSize="14" VerticalAlignment="Center" FontWeight="Bold" />
    </DataTemplate>
</ContentControl>

答案 3 :(得分:0)

在这里查看我的PaginatedObservableCollection http://jobijoy.blogspot.com/2008/12/paginated-observablecollection.html

这是一个子类observableCollection,它允许您绑定N个项目,并在设置ItemsPerPage时使UI显示“n”个项目。在你的情况下,如果你输入1并且可以将下一个和前一个也绑定到我的样本中的某些按钮。

希望这会给你一些想法。

答案 4 :(得分:0)

您可以实现仅提供CollectionView元素的自定义n。我在自动完成文本框控件实现中做了类似的操作,请在此处查看:

A Reusable WPF Autocomplete TextBox

向下滚动到标题为Limiting the Completions List的标题,看看我在那里做了什么。

答案 5 :(得分:0)

您可以通过创建仅生成单个项目的CollectionView来执行此操作。这很简单:只需子类CollectionView并覆盖OnCollectionChanged来设置过滤器,以过滤掉除基础集合中第一项之外的所有内容:

protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs args)
{
  base.OnCollectionChanged(args);
  var first = SourceCollection.FirstOrDefault();
  Filter = (obj) => obj == first;
}

现在您需要将此CollectionView插入ItemsSource。如果erm:Items的{​​{1}}生成实际集合或Binding with No Converter,您可以创建自己的MarkupExtension,将其包装在自定义视图中或添加转换器来进行包装。另一方面,如果erm:Items产生一个已经有转换器的Binding,或者你不能依赖它知道它产生什么,你应该使用更通用的解决方案 - 我建议附加属性。

要使用附加属性,您的ItemsControl将绑定如下:

ProvideValue

,SinglerCollectionViewCreator类中的代码为:

<ItemsControl
  my:SinglerCollectionViewCreator.ItemsSource="{erm:Items FieldName}"
  ... />

这项工作的方式是,只要在任何对象上设置了新的public class SinglerCollectionViewCreator : DependencyObject { public object GetItemsSource(... // use "propa" snippet to fill this in public void SetItemsSource(.... public static readonly DependencyProperty ItemsSourceProperty = ... { PropertyChangedCallback = (obj, e) { obj.SetValue(ItemsControl.ItemsSourceProperty, new SinglerCollectionView(e.NewValue)); } } } 属性,该值就会包含在SinglerCollectionViewCreator.ItemsSource类中,并且SinglerCollectionView设置在同一个对象上。

答案 6 :(得分:-1)

有没有办法在XAML中完全执行此操作,而无需编写代码?

<ItemsControl Height="100"  ItemsSource="{erm:Items FieldName}" Grid.Row="1" >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" TextWrapping="Wrap" FontSize="14" VerticalAlignment="Center" FontWeight="Bold" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>    
</ItemsControl>

我的物品来源如上所述。 Items标记扩展返回可观察的字符串集合,我无法控制observable集合。