События запускаются с ненагруженной страницы - PullRequest
0 голосов
/ 10 июня 2018

В моем приложении UWP у меня есть 2 страницы, на обеих из которых есть экземпляр пользовательского ListView.Когда первая страница выгружается из фрейма, вторая страница сразу загружается в нее.Кроме того, ListViews на обеих страницах имеют событие SelectionChanged, которое имеет вид x: Binded для обработчика событий, расположенного в MainViewModel.Пока у меня?

Проблема возникает, когда я перехожу с одной страницы на другую, а затем выбираю элементы в ListView.Почему-то событие SelectionChanged получает вызовы дважды.Я понял, что ListView на незагруженной странице также запускает событие SelectionChanged, хотя я не на этой странице и, следовательно, я не выбираю никаких элементов на этой странице!Weird.Надеюсь, у меня тут какой-то смысл.

    <!-- Page1.xaml -->
    <TemplatedControls:MyListView x:Name="MyListView"
                                  SelectionChanged="{x:Bind MainViewModel.MyListView_SelectionChanged}">
    </TemplatedControls:MyListView>

    <!-- Page2.xaml -->
    <TemplatedControls:MyListView x:Name="MyListView"
                                  SelectionChanged="{x:Bind MainViewModel.MyListView_SelectionChanged}">
    </TemplatedControls:MyListView>

1 Ответ

0 голосов
/ 11 июня 2018

Теперь я узнал, что эта проблема исчезает после запуска сборщика мусора и освобождения ресурсов предыдущего Page или чего-либо еще.Но это все еще странно, и я хотел бы знать, как наиболее эффективно решить эту проблему.

На самом деле это ожидаемое поведение.Когда вы подписываетесь на событие, используя шаблон слабого события (как, очевидно, делает UWP), обработка события продолжается до тех пор, пока сборщик мусора не соберет слушателя: https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/weak-event-patterns

Если вы хотите иметь возможность точно контролировать, когдаОтписавшись от события, вы можете переопределить метод On​Navigating​From и отписаться явно:

public partial class Page1 : Page
{
    public Page1()
{
    InitializeComponent();
    MyListView.SelectionChanged += MainViewModel.MyListView_SelectionChanged;
}
    ...

    protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
    {
        base.OnStartup(e);
        MyListView.SelectionChanged -= MainViewModel.MyListView_SelectionChanged;
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...