限制Items控件中显示的行数

问题描述 投票:2回答:7

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

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

谢谢,

wpf binding wpf-controls itemscontrol
7个回答
2
投票

假设您的ItemsSource设置为MyObservableCollection

那么,如果你改变你的ItemsSource所以它指向一个MyOneItemCollection怎么办?

然后,只需使用LINQ执行以下操作:

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

要么

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

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

1
投票

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

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

0
投票

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

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

希望这会给你一些想法。


0
投票

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

A Reusable WPF Autocomplete TextBox

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


0
投票

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

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

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

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

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

而SinglerCollectionViewCreator类中的代码将是:

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类中,并且ItemsControl.ItemsSource将设置在同一对象上。


-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集合。

© www.soinside.com 2019 - 2024. All rights reserved.