Когда мы должны реализовать INotifyPropertyChanged - PullRequest
0 голосов
/ 22 января 2020

Моя главная страница содержит свойства модели представления, а элементы xaml главной страницы связаны со свойствами модели представления с помощью x: bind. Нужно ли реализовывать INotifyPropertyChanged для главной страницы?

Если INotifyPropertyChanged не реализован на главной странице, то проблема со сборкой отсутствует. Но обновление связанных свойств иногда вызывает исключение во время выполнения.

Но когда я реализую INotifyPropertyChanged для главной страницы, все работает нормально.

property VM::TheViewModel^ ViewModel
{
   VM::TheViewModel^ get()
   {
       return VM::AppData::ViewModel;
   }
}

Класс AppData обеспечивает состояние c представления моделей

ref class AppData
    {
    public:
        static property VM::TheViewModel^ ViewModel
        {
            VM::TheViewModel^ get()
            {
                static VM::TheViewModel^ vm= ref new vm::TheViewModel();
                return vm;
            }
        }
    }

xaml привязка данных:

ItemsSource="{x:Bind ViewModel.MyProperty}"

Я не уверен, почему я должен реализовать

INotifyPropertyChanged

для главной страницы , Когда у меня есть свойства в классах модели представления?

Из фонового потока я останавливаю свои таймеры. Перейдите на страницу инициализации, а затем вернитесь на главную страницу с некоторыми условиями. При переключении обратно на главную страницу с помощью запуска таймеров и запуска фонового потока возникают исключения времени выполнения. Это не обычный сценарий. Иногда это происходит, иногда это не так. Но так бывает.

OnSomeModelChange()
{
...
    if (notifyId == SessionPropertyNotifyType::Session)
        {
            StopTimers();
            AppData::ViewModelInfo->ClearErrors();
            auto rootFrame = dynamic_cast<Frame^>(Window::Current->Content);
            rootFrame->Navigate(TypeName(InitPage::typeid), nullptr, ref new Animation::SuppressNavigationTransitionInfo);
            Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
                Windows::UI::Core::CoreDispatcherPriority::Low,
                ref new Windows::UI::Core::DispatchedHandler([this]() { InitSessionAsync(); }, CallbackContext::Any)
            );
        }
...
}

Стек вызовов: enter image description here

Исключение: выброшено исключение: нарушение прав чтения.

this->__this->**** was 0xDDDDDDDD.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...