From 3b7b3ddb4ae06e2eaff96f5ac1c22ef7d2ef7b11 Mon Sep 17 00:00:00 2001 From: Ranjesh <28935693+ranjeshj@users.noreply.github.com> Date: Fri, 24 Jun 2022 21:06:33 -0700 Subject: [PATCH] Revoke the items source view changed event if there is one irrespective of the oldValue We sometimes seem to end up with handler that is not revoked because setting a new value for m_itemsSourceView before revoking causes the referenced value (pointed to by oldValue) becoming null. If the handler is not revoked, then we can end up in a crash if the events are being fired on a collection that is not the ItemsSource of repeater anymore. To avoid this completely, we can revoke the handler if there is one irrespective of the oldValue and also do it before saving the newValue. --- dev/Repeater/ItemsRepeater.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev/Repeater/ItemsRepeater.cpp b/dev/Repeater/ItemsRepeater.cpp index 8ae2676b74..2eed8e0d3e 100644 --- a/dev/Repeater/ItemsRepeater.cpp +++ b/dev/Repeater/ItemsRepeater.cpp @@ -540,13 +540,13 @@ void ItemsRepeater::OnDataSourcePropertyChanged(const winrt::ItemsSourceView& ol throw winrt::hresult_error(E_FAIL, L"Cannot set ItemsSourceView during layout."); } - m_itemsSourceView.set(newValue); - - if (oldValue) + if (m_itemsSourceViewChanged) { m_itemsSourceViewChanged.revoke(); } + m_itemsSourceView.set(newValue); + if (newValue) { m_itemsSourceViewChanged = newValue.CollectionChanged(winrt::auto_revoke, { this, &ItemsRepeater::OnItemsSourceViewChanged });