有没有办法限制在items控件中显示的行数。 ?
我有一个可观察的字符串集合,它们绑定到Items控件。我想限制显示的行数只有一个。该系列可以有多个。
谢谢,
假设您的ItemsSource
设置为MyObservableCollection
。
那么,如果你改变你的ItemsSource
所以它指向一个MyOneItemCollection
怎么办?
然后,只需使用LINQ执行以下操作:
using System.Linq;
MyOneItemCollection = MyObservableCollection.First();
要么
using System.Linq;
MyOneItemCollection = MyObservableCollection.Single(item => item.Id = MyId);
您可以使用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}">
如果您只需要显示一个项目,则可以使用ContentControl显示第一个项目,而使用相同的可用模板选项:
<ContentControl DataContext="{erm:Items FieldName}" Content="{Binding [0]}">
<DataTemplate>
<TextBlock Text="{Binding}" TextWrapping="Wrap" FontSize="14" VerticalAlignment="Center" FontWeight="Bold" />
</DataTemplate>
</ContentControl>
在这里查看我的PaginatedObservableCollection http://jobijoy.blogspot.com/2008/12/paginated-observablecollection.html
这是一个子类observableCollection,它允许您绑定N个项目,并在设置ItemsPerPage时使UI显示“n”个项目。在你的情况下,如果你放1并且可以将下一个和前一个也绑定到我的样本中的某些按钮。
希望这会给你一些想法。
您可以实现仅提供CollectionView
元素的自定义n
。我在自动完成文本框控件实现中做了类似的操作,请在此处查看:
A Reusable WPF Autocomplete TextBox
向下滚动到标题为Limiting the Completions List
的标题,看看我在那里做了什么。
您可以通过创建仅生成单个项目的CollectionView
来完成此操作。这很简单:只需子类CollectionView
并覆盖OnCollectionChanged
以设置过滤器以过滤掉除底层集合中第一个项目之外的所有内容:
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs args)
{
base.OnCollectionChanged(args);
var first = SourceCollection.FirstOrDefault();
Filter = (obj) => obj == first;
}
现在你需要将这个CollectionView
插入你的ItemsSource
。如果erm:Items
的ProvideValue
生成实际集合或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
将设置在同一对象上。
有没有办法在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集合。