我有一個自定義日曆控件,有一個自定義的視圖綁定。在這個視圖綁定中,我們掛鉤了一些未解耦的事件,因此垃圾收集未完成。以下是我們的自定義視圖綁定。正如你所看到的,事件被連接到構造函數中,並且在OnSelectedDate事件中被解耦(用戶選擇一個日期)。因此,如果您選擇一個日期,則事件的分離正確並收集垃圾,但如果您剛剛返回,事件仍會掛鉤並且不會執行垃圾收集。我想過用空值觸發事件,從而使事件變得無法解決。但我認爲必須有一些更聰明的方法來實現這一點。垃圾收集問題與自定義視圖綁定單聲道觸摸和mvvmcross
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;
}
}
}
}
任何幫助表示讚賞:)
感謝您的建議斯圖爾特,但我現在給它一個事件來解開任意事件,從而具有完整垃圾收集解決了這個問題。我會把它打開,看看我在接下來的日子裏是否會得到更好的解決方案:) – Bjarke
我對你的主要建議仍然是一樣的:一起獲得一個簡單的應用程序來重現問題 - 然後其他人可以真正幫助。我正在考慮在v3中使用WeakReferences。如果僅僅是你的一個綁定就是問題,那麼把那個切換到WeakReferences將會非常快速和簡單。無論如何,祝你好運! – Stuart