0

我有一个自定义日历控件,它有一个自定义视图绑定。在这个视图绑定中,我们连接了一些未正确解耦的事件,因此垃圾收集未完成。下面是我们的自定义视图绑定。如您所见,事件在构造函数中连接,并在触发 OnSelectedDate 事件时解耦(用户选择日期)。因此,如果您选择一个日期,则事件解耦正确并被垃圾收集,但如果您只是返回,该事件仍处于关联状态且不执行垃圾收集。我考虑过用空值触发事件,从而解除事件。但我认为必须有一些更聪明的方法来实现这一点。

namespace CmsApp.Core.Binders
{
    public class CalendarViewBinding:MvxBaseTargetBinding
    {
        private CalendarView _calendarView;
        private DateTime _currentValue;
         public CalendarViewBinding(CalendarView calendarView)
        {
            _calendarView = calendarView;
            _calendarView.OnDateSelected+=OnDateSelected;
        }

         protected override void Dispose(bool isDisposing)
         {
             if(_calendarView!=null)
             {
                 _calendarView.OnDateSelected -= OnDateSelected;
                 _calendarView = null;
             }
             base.Dispose(isDisposing);

         }

        private void OnDateSelected(object sender, SelectedDateEventArgs args)
        {
            _currentValue = args.SelectedDate;
            this.FireValueChanged(_currentValue);
            _calendarView.OnDateSelected -= OnDateSelected;
        }

        public override void SetValue(object value)
        {
            var date = (DateTime)value;
            _currentValue = date;
            _calendarView.SelectedDate = _currentValue;

        }

        public override Type TargetType
        {
            get
            {
                return typeof(DateTime);
            }
        }

        public override MvxBindingMode DefaultMode
        {
            get
            {
                return MvxBindingMode.TwoWay;
            }
        }
    }
}

任何帮助表示赞赏:)

4

1 回答 1

0

在我看来,您的绑定几乎是正确的。

我能看到的唯一问题是它过于频繁地取消订阅该事件 - 你不能打电话_calendarView.OnDateSelected -= OnDateSelected;两次 - 但我认为这不是你看到的问题。

我目前猜测问题不在您使用的代码中:

  • 您正在使用的底层框架中的绑定代码中存在错误
  • 或者您使用此绑定的方式存在错误/问题
  • 或者您的内存泄漏与此绑定无关

从此处发布的有限代码中测试这一点并不容易,但如果您可以制作一个简单的应用程序来重现您所看到的泄漏,那就更简单了。分享它,您可能会获得更多反馈。


如果您认为我的猜测是错误的,那么我唯一可以建议的是您在绑定中切换到 WeakReferences - 但这感觉就像是贴膏药而不是治愈方法。


只需添加一个链接到何时在 mono touch / mvvmcross 中释放对象

于 2013-02-08T11:41:18.243 回答