Обновить свойство ViewModel A из ViewModel B в UWP - PullRequest
1 голос
/ 06 апреля 2020

MainPage отображает список и кнопку. Источником ListView является Адреса (привязка данных). Когда пользователь нажимает кнопку, открывается AddAddressPage. Оба имеют свою собственную ViewModel. В AddAddressPage пользователь может заполнить формуляр и нажать кнопку, чтобы добавить новый адрес в список. Все работает, кроме обновления. После добавления адреса ничего не происходит, и мне нужно перезапустить приложение, чтобы увидеть новый адрес (я также попробовал ObservableCollection). Я использовал точки разрыва и заметил, что Getter вызывается не дважды, а Setter.

MainPageViewModel:

private List<Address> addresses;

public List<Address> Addresses
{
    get
    {
        return this.addresses;
    }
    set
    {
        this.SetValue(ref this.addresses, value);
    }
}

SetValue:

public void SetValue<T>(ref T Backingfield, T value, [CallerMemberName] string propertyName = null)
{
    if (EqualityComparer<T>.Default.Equals(Backingfield, value))
    {
        return;
    }
    else
    {
        Backingfield = value;

        this.OnPropertyChanged(propertyName);
    }
}

AddAddressViewModel :

// Code to insert new address into SQLite database here...

MainPageViewModel mpvm = new MainPageViewModel();
mpvm.Addresses = SQLite.Select(); // Select returns the database as List

1 Ответ

0 голосов
/ 07 апреля 2020

На основе вашего кода, хотя вы присваиваете обновленное значение в AddAddressViewModel, поскольку созданный вами mpvm не связан с ListView в MainPage, он изменяется, но не влияет на ListView. Таким образом, вы можете подписаться на событие Closed вашего нового окна, когда вы закроете AddAddressPage, событие будет запущено. Затем вы можете вернуться к основному виду и назначить новые данные его свойству Адреса. Например:

MainPageViewModel.cs:

private async void ToAddAddress()
{
    CoreApplicationView newView = CoreApplication.CreateNewView();
    var newViewId = 0;

    await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        Frame frame = new Frame();
        frame.Navigate(typeof(AddAddressPage), this.addresses);
        Window.Current.Content = frame;

        // You have to activate the window in order to show it later.
        Window.Current.Activate();
        Window.Current.Closed += Current_Closed;
        newViewId = ApplicationView.GetForCurrentView().Id;
    });

    bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);            
}

private async void Current_Closed(object sender, CoreWindowEventArgs e)
{
    await CoreApplication.MainView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        this.Addresses = SQLite.Select();
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...