Представление для ListViewItem не выпущено - PullRequest
0 голосов
/ 10 октября 2019

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; }
    }


...