0

カスタム ビュー バインディングがあるカスタム カレンダー コントロールがあります。このビューバインディングでは、適切に分離されていないいくつかのイベントを接続しているため、ガベージ コレクションが完了していません。以下は、カスタム ビュー バインディングです。ご覧のとおり、イベントはコンストラクターにフックされ、OnSelectedDate イベントがトリガーされます (ユーザーが日付を選択します)。したがって、日付を選択すると、イベントは適切に分離され、ガベージ コレクションが行われますが、単に前に戻ると、イベントは引き続きフックされ、ガベージ コレクションは実行されません。null値でイベントをトリガーし、それによってイベントをデコルプすることを考えました。しかし、これを達成するにはもっと賢い方法が必要だと思います。

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

あなたのバインディングはほぼ正しいように見えます。

私が見ることができる唯一の問題は、イベントから頻繁に登録解除されることです-2_calendarView.OnDateSelected -= OnDateSelected;回呼び出すことはできません-しかし、これがあなたが見ている問題ではないと思います.

私は現在、問題はあなたが使用しているコードにはないと推測しています:

  • 使用している基礎となるフレームワークのバインディング コードにバグがあるか
  • または何かがこのバインディングを使用している方法のバグ/問題です
  • または、メモリリークはこのバインディングとは何の関係もありません

ここに掲載されている限られたコードからこれをテストするのは簡単ではありませんが、発生しているリークを再現する簡単なアプリを作成できれば簡単です。それを共有すると、より多くのフィードバックを得ることができるかもしれません。


私の推測が間違っていると思われる場合、私が提案できる唯一のことは、バインディング内で WeakReferences に切り替えることですが、これは治療法ではなく、絆創膏のように感じます。


モノタッチ/ mvvmcrossでオブジェクトを解放するタイミングへのリンクを追加するだけです

于 2013-02-08T11:41:18.243 に答える