ReactiveUi Memoryleak使用ReactiveList viewinjection

时间:2017-01-24 07:52:08

标签: c# wpf reactiveui

我准备的设置非常简单。 我有一个shellview,其中包含一个视图,该视图只包含一个绑定到被动列表的Listbox

public LacquerProductionOrderListView()
        {
            InitializeComponent();


            this.WhenActivated(
                d =>
                {
                    this.
                    OneWayBind(ViewModel, vm => vm.LacquerProductionOrders,
                        v => v.LacquerProductionOrderList.ItemsSource)
                        .AddTo(d);
                });
        }

Viewmodel也非常简单,仅用于测试目的。

    public LacquerProductionOrderListViewModel()
    {
        this.activator = new ViewModelActivator();


        LacquerProductionOrders = new ReactiveList<LacquerProductionOrderViewModel>();



        var c1 = Observable.Interval(TimeSpan.FromSeconds(5))
           .ObserveOn(DispatcherScheduler.Current)
           .Subscribe(_ => LacquerProductionOrders.AddRange(new List<LacquerProductionOrderViewModel>()

        {
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0)),
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0)),
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0)),
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0)),
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0)),
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0)),
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0)),
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0)),
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0)),
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0)),
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0)),
            new LacquerProductionOrderViewModel(new ProductionOrder(null, "foo", 0, 0, 0))
        }
               )
        );

        var c = Observable.Interval(TimeSpan.FromSeconds(7))
            //.ObserveOn(DispatcherScheduler.Current)
            .Subscribe(_ => LacquerProductionOrders.Clear());

        this.WhenActivated(d =>
        {
            c.AddTo(d);
            c1.AddTo(d);

        });

    }

因此它填充列表并清除它。我现在的问题是,他的析构函数

    public LacquerProductionOrderViewModel(ProductionOrder productionOrder)
    {
        this.activator = new ViewModelActivator();

        _productionOrder = productionOrder;

    }

    ~LacquerProductionOrderViewModel()
    {
        Console.WriteLine("destructor called.");
    }

永远不会被调用,因此应用程序的内存消耗正在快速增长。也许你可以告诉我哪里弄错了,或者我能做些什么。

所以我的解决方法是使用

<ListBox.ItemTemplate>    
<DataTemplate> 
...
</DataTemplate> 
</ListBox.ItemTemplate> 

而不是为列表中的视图模型注册视图。这可行,但显而易见的是,能够使用注入的视图/视图模型会更好。

亲切的问候

0 个答案:

没有答案