Ограничить количество строк, отображаемых в элементе управления "Элементы" - PullRequest
2 голосов
/ 27 января 2010

Есть ли способ ограничить количество строк, отображаемых в элементе управления.

У меня есть наблюдаемая коллекция строк, которые связаны с управлением Предметами. Я хочу ограничить количество отображаемых строк только одной. Коллекция может иметь более одного.

Спасибо

Ответы [ 7 ]

2 голосов
/ 27 января 2010

Допустим, ваш ItemsSource установлен на MyObservableCollection.

Ну, а что если вы измените ItemsSource так, чтобы он указывал вместо MyOneItemCollection?

Затем просто используйте LINQ, чтобы сделать что-то вроде этого:

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

или

using System.Linq;
MyOneItemCollection = MyObservableCollection.Single(item => item.Id = MyId);
2 голосов
/ 07 января 2017

Вы можете использовать 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 голос
/ 28 января 2010

Если вам когда-либо нужен только один элемент для отображения, вы можете показать первый элемент с помощью ContentControl вместо тех же доступных параметров шаблонов:

<ContentControl DataContext="{erm:Items FieldName}" Content="{Binding [0]}">
    <DataTemplate>
        <TextBlock Text="{Binding}" TextWrapping="Wrap" FontSize="14" VerticalAlignment="Center" FontWeight="Bold" />
    </DataTemplate>
</ContentControl>
0 голосов
/ 28 января 2010

Вы можете сделать это, создав CollectionView, который производит только один предмет. Это довольно просто: просто создайте подкласс CollectionView и переопределите OnCollectionChanged, чтобы установить фильтр для фильтрации всего, кроме первого элемента в базовой коллекции:

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

Теперь вам нужно вставить это CollectionView в ваш ItemsSource. Если erm:Items s ProvideValue создает фактическую коллекцию или привязку без конвертера, вы можете просто создать свой собственный 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 устанавливается для того же объекта.

0 голосов
/ 28 января 2010

Вы можете реализовать пользовательский CollectionView, который предоставляет только n элементы. Я сделал нечто подобное в моей реализации элемента управления textcom автозаполнения, проверить это здесь:

Многоразовый текстовый блок автозаполнения WPF

Прокрутите вниз до заголовка под названием Limiting the Completions List посмотрите, что я там сделал.

0 голосов
/ 27 января 2010

Есть ли способ сделать это полностью в 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 возвращает наблюдаемую коллекцию строк, и я не могу контролировать наблюдаемую коллекцию.

0 голосов
/ 27 января 2010

Проверьте мою коллекцию PaginatedObservableCollection здесь http://jobijoy.blogspot.com/2008/12/paginated-observablecollection.html

Это подклассифицированная коллекция observableCollection, которая позволяет связывать с N элементами и заставлять пользовательский интерфейс отображать «n» элементов при установке ItemsPerPage. В вашем случае, если вы поставите 1 и можете связать следующий и предыдущий также с некоторыми кнопками, как в моем примере.

Надеюсь, это даст вам представление.

...