Prism Sample 21-PassingParameters

这个例子是说明导航中传递参数,类似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行在是否创建视图实例上,根据本地数据已经有并且姓名相同的话,采用原有数据,否则创建新实例。

 

上一篇:8. Prism导航


下一篇:Prism Sample 4 View Discovery