每次导航到页面时如何在视图模型中调用异步方法
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
我在我的项目中使用 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