Перейти к основному содержимому

Collection Binders

Биндеры для отображения коллекций ViewModel в виде списков UI-элементов.


Обзор

БиндерНазначение
ViewModelObservableListBinderДинамический список с фабрикой View
ViewModelCollectionBinder<T>Статическая коллекция (фиксированные View)
ViewModelObservableDictionaryBinderСловарь с фабрикой View
VirtualizedListItemSourceBinderИсточник данных для VirtualizedList

ViewModelObservableListBinder

Основной биндер для отображения ObservableList<IViewModel>. При добавлении/удалении элементов автоматически создаёт/уничтожает View.

Принцип работы

ObservableList<IViewModel> (ViewModel)
→ ViewModelObservableListBinder
→ IViewFactory.Create(viewModel) при Add
→ IViewFactory.Release(view) при Remove

Inspector-свойства

СвойствоТипОписание
FactoryIViewFactory<MonoView>Фабрика для создания View (PrefabViewFactory или PrefabViewPool)
FilterICollectionFilter<IViewModel>Опциональный фильтр
OrderICollectionOrder<IViewModel>Опциональная сортировка

Режим

OneWay и OneTime.

Пример ViewModel

[ViewModel]
public partial class TodoListViewModel
{
[OneTimeBind]
private IReadOnlyObservableListSync<TodoItemViewModel> _items;

public TodoListViewModel(TodoStorage storage)
{
_items = storage.Todos.CreateSync(
todo => new TodoItemViewModel(todo)
);
}
}

MonoBinder-вариант: ObservableListViewModelMonoBinder.


ViewModelCollectionBinder<T>

Для статических коллекций с предварительно созданными View:

// В Inspector: массив _views заполнен заранее
// При привязке: View[0].Initialize(collection[0]), View[1].Initialize(collection[1])...
// Лишние View скрываются через SetActive(false)

Подходит для фиксированного количества элементов (например, 5 слотов инвентаря).


VirtualizedListItemSourceBinder

Устанавливает ItemsSource для VirtualizedList:

[ViewModel]
public partial class ListViewModel
{
[OneTimeBind]
private FilteredList<ItemViewModel> _filteredItems;

[OneTimeBind]
private ObservableList<ItemViewModel> _items;

public ListViewModel()
{
_items = new ObservableList<ItemViewModel>();
_filteredItems = new FilteredList<ItemViewModel>(_items);
}
}

Inspector-свойства

СвойствоОписание
FilterICollectionFilter<IViewModel>
OrderICollectionOrder<IViewModel>

Создаёт внутренний FilteredList<IViewModel> при наличии фильтра/сортировки.

Режим: OneTime.


View Factories

Фабрики используются ViewModelObservableListBinder для создания View:

PrefabViewFactory

Создаёт View через Object.Instantiate:

Create(viewModel) → Instantiate(prefab) → SetSibling → Initialize(viewModel)
Release(view) → DestroyViewAndGameObject()

PrefabViewPool

Переиспользует View через ObjectPool:

Create(viewModel) → Pool.Get() → Initialize(viewModel) → SetActive(true)
Release(view) → Deinitialize() → SetActive(false) → Pool.Release()

Свойства:

  • _initialCount — начальный размер пула
  • _maxCount — максимальный размер

Рекомендация: Используйте PrefabViewPool для часто обновляемых списков (чат, лента).

Подробнее: View Factories.


Фильтрация и сортировка

ICollectionFilter<T>

public interface ICollectionFilter<in T>
{
bool Matches(T item);
}

Реализуйте для создания кастомного фильтра:

[Serializable]
public class CompletedFilter : ICollectionFilter<IViewModel>
{
public bool Matches(IViewModel item) =>
item is ItemViewModel viewModel && viewModel.IsCompleted;
}

ICollectionOrder<T>

public interface ICollectionOrder<in T> : IComparer<T> { }

Реализуйте Compare, как у обычного IComparer<T>. Пустой слот в Inspector сохраняет порядок исходной коллекции.

Готовые фильтры

ФильтрПоведение
AndCollectionFilter<T>Проходит элемент, который пропускают все вложенные фильтры
OrCollectionFilter<T>Проходит элемент, который пропускает хотя бы один вложенный фильтр
NotCollectionFilter<T>Инвертирует вложенный фильтр
ConditionalCollectionFilter<T>Применяет вложенный фильтр только при включённом IsEnabled
ConverterCollectionFilter<T>Пропускает элемент, для которого IConverter<T, bool> вернул true
PredicateCollectionFilter<T>Обёртка над Predicate<T> для фильтров из кода

Пустой вложенный слот пропускает всё.

Готовые сортировки

СортировкаПоведение
SequenceCollectionOrder<T>Применяет вложенные порядки по очереди: решает первый, различивший элементы
InverseCollectionOrder<T>Обращает вложенный порядок
ComparisonCollectionOrder<T>Обёртка над IComparer<T> или Comparison<T> для сортировок из кода

См. также