Вы можете сделать это, создав 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
устанавливается для того же объекта.