这个例子是说明导航中传递参数,类似Asp.net中实现。
例子的模板,是例16中使用regionContext实现过的。在例16中,
<Grid x:Name="LayoutRoot" Background="White" Margin="10"> <Grid.RowDefinitions> <RowDefinition Height="100"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <ListBox x:Name="_listOfPeople" ItemsSource="{Binding People}"/> <ContentControl Grid.Row="1" Margin="10" prism:RegionManager.RegionName="PersonDetailsRegion" prism:RegionManager.RegionContext="{Binding SelectedItem, ElementName=_listOfPeople}"/> </Grid>
也是绑定到上面的列表项,但是数据是在RegioContext中解析。
本例中,
public PersonListViewModel(IRegionManager regionManager) { _regionManager = regionManager; PersonSelectedCommand = new DelegateCommand<Person>(PersonSelected); CreatePeople(); } private void PersonSelected(Person person) { var parameters = new NavigationParameters(); parameters.Add("person", person); if (person != null) _regionManager.RequestNavigate("PersonDetailsRegion", "PersonDetail", parameters); }
本例中,导航命令中的使用了参数,而参数是一个字典形式。
到了目标视图中,又解析字典,将数值放到VM中
1 public class PersonDetailViewModel : BindableBase, INavigationAware 2 { 3 private Person _selectedPerson; 4 public Person SelectedPerson 5 { 6 get { return _selectedPerson; } 7 set { SetProperty(ref _selectedPerson, value); } 8 } 9 10 public PersonDetailViewModel() 11 { 12 13 } 14 15 public void OnNavigatedTo(NavigationContext navigationContext) 16 { 17 var person = navigationContext.Parameters["person"] as Person; 18 if (person != null) 19 SelectedPerson = person; 20 } 21 22 public bool IsNavigationTarget(NavigationContext navigationContext) 23 { 24 var person = navigationContext.Parameters["person"] as Person; 25 if (person != null) 26 return SelectedPerson != null && SelectedPerson.LastName == person.LastName; 27 else 28 return true; 29 } 30 31 public void OnNavigatedFrom(NavigationContext navigationContext) 32 { 33 34 } 35 }
15行就是解析参数包(类似viewbag)并获得数据。
22行在是否创建视图实例上,根据本地数据已经有并且姓名相同的话,采用原有数据,否则创建新实例。