是否有办法限制在items控件中显示的行数。 ?
我有一个可观察的字符串集合,它们绑定到Items控件。我想限制显示的行数只有一个。该集合可以有多个。
谢谢,
答案 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集合。