Reactiveui используется для привязки ReadOnlyObservableCollection к ItemsSource и добавления элементов в коллекцию. Коллекция имеет максимальное значение и будет соответственно удалена, но автоматически сгенерированное представление не освобождается.
Та же обработка была выполнена с использованием ViewModel, у которого нет зависимости, но представление не было освобождено.
public partial class App : Application
{
public App()
{
Locator.CurrentMutable.RegisterViewsForViewModels(Assembly.GetCallingAssembly());
}
}
public class MainWindowViewBase : ReactiveWindow<MainWindowViewModel>
{
}
public partial class MainWindowView : MainWindowViewBase
{
public MainWindowView()
{
InitializeComponent();
ViewModel = new MainWindowViewModel();
this.WhenActivated(d =>
{
this.OneWayBind(ViewModel,
vm => vm.Collection,
v => v.listBox.ItemsSource)
.DisposeWith(d);
});
}
}
public class MainWindowViewModel
{
private readonly ReadOnlyObservableCollection<StringViewModel> _collection;
public ReadOnlyCollection<StringViewModel> Collection => _collection;
public MainWindowViewModel()
{
Observable.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds(10), RxApp.TaskpoolScheduler)
.Select(x => new StringViewModel(x.ToString()))
.ToObservableChangeSet(limitSizeTo: 300)
.ObserveOn(RxApp.MainThreadScheduler)
.Bind(out _collection)
.DisposeMany()
.Subscribe();
}
}
public class StringViewBase : ReactiveUserControl<StringViewModel>
{
}
public partial class StringView : StringViewBase
{
public StringView()
{
InitializeComponent();
this.WhenAnyValue(x => x.ViewModel)
.Where(x => x != null)
.Do(Asign)
.Subscribe();
}
private void Asign(StringViewModel vm)
{
_textBlock.Text = vm.Value;
}
}
public class StringViewModel : ReactiveObject
{
public StringViewModel(string value)
{
Value = value ?? throw new ArgumentNullException(nameof(value));
}
public string Value { get; }
}