Skip to content

Commit

Permalink
Revoke the items source view changed event if there is one irrespecti…
Browse files Browse the repository at this point in the history
…ve of the oldValue (#7277)

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.
  • Loading branch information
ranjeshj authored Jul 5, 2022
1 parent 25bcb7a commit 2102156
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions dev/Repeater/ItemsRepeater.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down

0 comments on commit 2102156

Please sign in to comment.