Prism导航入门学习-有参传递-笔记

发布于:2024-10-16 ⋅ 阅读:(10) ⋅ 点赞:(0)

创建一个用户控件B,在用户控件中实现双向绑定

xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"

在主窗口MainWindow中创建按钮,指向command导航命令和CommandParameter,并创建一个region区域

<StackPanel Orientation="Horizontal">
    <Button Height="30" Width="20" Margin="10" Command="{Binding NavigationComand}" CommandParameter="A">A</Button>
    <Button Height="30" Width="20" Margin="10" Command="{Binding NavigationComand}" CommandParameter="B">B</Button>
    <Button Height="30" Width="20" Margin="10" Command="{Binding NavigationComand}" CommandParameter="C">C</Button>
    <Button Height="30" Width="20" Margin="10" Command="{Binding NavigationComand}" CommandParameter="D">D</Button>
    <Button Height="30" Width="20" Margin="10" Command="{Binding NavigationComand}" CommandParameter="E">E</Button>
    <Button Height="30" Width="20" Margin="10" Command="{Binding NavigationParaCommand}" CommandParameter="F">F</Button>
</StackPanel>

<ContentControl Grid.Column="1" prism:RegionManager.RegionName="ContentRegion" />

在MainWindowViewModel.cs文件中创建导航命令,用于在button中进行binding

//创建一个导航命令,需要传递一个页面名称
public DelegateCommand<string> NavigationParaCommand { get; set; }

创建一个导航方法,在方法中传递参数

public void NavigationPara(string viewName)
{
    NavigationParameters parameter = new();
    parameter.Add("id", 2);
    parameter.Add("name", "易燃易爆炸");
    _regionManager.RequestNavigate("ContentRegion", viewName,parameter);
}

在有参构造方法中,将导航方法指向导航命令中去

 public MainWindowViewModel(IRegionManager regionManager)
 {
     _regionManager = regionManager;
     NavigationParaCommand = new(NavigationPara);
 }

在运行程序时先加载主页面中的构造函数,在构造方法中将导航方法放入到导航命令中去,在command属性中binding对应的导航命令,在CommandParameter属性中指定对应的页面名称,例:

 <Button Height="30" Width="20" Margin="10" Command="{Binding NavigationParaCommand}" CommandParameter="F">F</Button>

在对应的页面中,实现对应的接口INavigationAware,

 public bool IsNavigationTarget(NavigationContext navigationContext)
 {
     throw new NotImplementedException();
 }

 public void OnNavigatedFrom(NavigationContext navigationContext)
 {
     throw new NotImplementedException();
 }

 //导航完成前
 public void OnNavigatedTo(NavigationContext navigationContext)
 {
     var id = navigationContext.Parameters.GetValue<int>("id");
     var name = navigationContext.Parameters.GetValue<string>("name");
     Name = id + name;
 }

OnNavigatedTo导航完成之前,在成功导航到该页面前触发

OnNavigatedFrom在当前视图即将被导航离开时触发,例如打开A,然后导航到B页面被触发

IsNavigationTarget在确定目标视图是否适合当前导航请求时被调用。例如,当多个视图都可以匹配当前导航请求时,通过这个方法来决定是否将当前视图作为目标

实现后触发就可以实现传参导航


 

//调用以确定此实例是否可以处理导航请求,否则新建实例,false时创建新实例
public bool IsNavigationTarget(NavigationContext navigationContext)
{
    return false;//设置为false时,这些实例会被clr销毁,true时不会销毁,影响内存
}