每次导航到页面时如何在视图模型中调用异步方法

How to call async method in the View Model everytime when page is navigated to

我在我的项目中使用 MVVM light 和 Cimbalino Toolkit,我想在页面导航到时更新我的​​ ListView。 我在视图模型中实现了一种异步方法:

private async void getMyNoteList()
     {
         ObservableCollection<Note> list = await _noteSessionService.getNoteList();
         NoteList = new ObservableCollection<Note>(list);        
     }

这里,在我的 NoteListPageViewModel.cs 里。我有一个 属性 NoteList:

public ObservableCollection<Note> NoteList
    {
        get { return _noteList; }

        set { Set(() => NoteList, ref _noteList, value); }
    }

并且绑定到页面中的ListView。

<ListView  x:Name="NoteListView" ItemsSource="{Binding NoteList}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Border 
                    BorderBrush="White"
                    BorderThickness="2"
                    CornerRadius="5"
                    Width="360"
                    Margin="10,5">

                    <FlyoutBase.AttachedFlyout>
                        <MenuFlyout>
                            <MenuFlyoutItem Text="Delete"  
                        />

                            <MenuFlyoutItem Text="Edit" 
                         />
                        </MenuFlyout>
                    </FlyoutBase.AttachedFlyout>

                    <StackPanel >
                        <TextBlock
                               FontSize="30" Text="{Binding NoteTitle}"/>
                        <TextBlock
                               FontSize="25"
                               TextWrapping="Wrap" Text="{Binding NoteContent}"/>
                    </StackPanel>

                </Border>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

由于笔记列表是added/deleted其他服务,我需要在每次导航到页面时调用异步方法,以便列表是最新更新的。

我把 getMyNoteList() 放在这里:

 public NoteListPageViewModel(INavigationService navigationService,
        INoteSessionService noteSessionService,
        IMessageBoxService messageBox,
        ILogManager logManager)
    {
        _navigationService = navigationService;
        _noteSessionService = noteSessionService;
        _messageBox = messageBox;
        _logManager = logManager;
        getMyNoteList();

        DeleteComamand = new RelayCommand(
           () =>
           {


           });

        EditCommand = new RelayCommand(
           () =>
           {

           });

    }

并且该页面只能在第一次导航到时更新。

由于我使用的是GalaSoft.MvvmLight,在viewModelLocator中,我已经注册了ViewModel:

SimpleIoc.Default.Register<NoteListPageViewModel>();

有什么方案可以满足我的期望吗?在默认相关Page.xaml.cs,我这里什么都不做:

 protected override void OnNavigatedTo(NavigationEventArgs e)
    {


    }

最好的方法是使用 MVVM Light 消息。 因此,在页面的 OnNavigatedTo 方法中,只需发送一个带有一些字符串值的 NotificationMessage 来指示该页面已被导航到。

在您的视图模型中注册 NotificationMessage 并使用异步方法对其进行操作以重新加载您的列表。

如果您不了解 MVVM Light 的消息传递系统 - 请在此处查看 MSDN 杂志网站上的深入教程 https://msdn.microsoft.com/en-us/magazine/dn745866.aspx