Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置BindingContext后调用Prism for Xamarin forms Initialize_Xamarin_Xamarin.forms_Prism - Fatal编程技术网

设置BindingContext后调用Prism for Xamarin forms Initialize

设置BindingContext后调用Prism for Xamarin forms Initialize,xamarin,xamarin.forms,prism,Xamarin,Xamarin.forms,Prism,我希望能在这里扩大我的职位 我不完全理解在使用Prism时视图和viewmodel初始化期间发生的事件顺序。丹很好地解释了这一点,但我仍然遗漏了一些东西 我的场景很简单,我在导航参数中传递一个ID,viewmodel将使用该ID从服务中查找一些数据,这一切都是在Initialize方法中完成的。但是,问题是视图属性是在调用Initialize方法之前激发的,这意味着我还没有要显示的数据,这给我带来了一些额外的工作 丹对事件的顺序作了很好的解释 创建视图时,将执行视图的ctor中的任何内容 如果您

我希望能在这里扩大我的职位

我不完全理解在使用Prism时视图和viewmodel初始化期间发生的事件顺序。丹很好地解释了这一点,但我仍然遗漏了一些东西

我的场景很简单,我在导航参数中传递一个ID,viewmodel将使用该ID从服务中查找一些数据,这一切都是在Initialize方法中完成的。但是,问题是视图属性是在调用Initialize方法之前激发的,这意味着我还没有要显示的数据,这给我带来了一些额外的工作

丹对事件的顺序作了很好的解释

创建视图时,将执行视图的ctor中的任何内容 如果您专门附加了ViewModelLocator.AutowireViewModel属性,则会将ViewModel解析为ctor的一部分 如果您没有明确选择退出ViewModelLocator的Autowire,则导航服务将在完成ctor后为您设置它 导航服务随后将调用Prism 7.2+的IAutoInitialize/IIInitialize/InitializeAsync。。。INavigatingAware.on在旧版本的Prism中导航到 NavigationService随后会将页面推送到导航堆栈上。请注意,这可能对用户可见,也可能不可见,因为深度链接时可能必须先添加其他页面 NavigationService随后将调用OnNavigatedFrom/OnNavigatedTo。在这里,人们经常报告由于绑定更新而出现可见延迟。 这就是我需要帮助的地方:

我假设第3步Dan说导航服务将为您设置它,这意味着视图的BindingContext此时已经设置好了? 那么,BindingContext是在ctor之后但在Initialize方法之前设置的吗? 这意味着Initialize方法中设置的所有属性将始终激发两次,一次是在设置绑定时激发,另一次是通过Initialize或Autoinitialize设置属性

在我的例子中,这并不理想,因为所有属性都必须在Initialize方法中引发,并且我必须处理所有null情况

我真的不想通过退出autowire来手动完成这一切,但我看不到任何其他选项,我是否遗漏了什么? 有人知道是否可以修改Prism来延迟BindingContext的设置,直到调用Initialize方法之后吗


谢谢。

Prism提供了初始化方法:

初始化。初始化 IInIAlizeAsync.InitializeAsync 自动初始化 只会被解雇一次

因为ViewModelLocator是专门选择退出而不是选择加入的,所以它有两种工作方式

您已经在XAML或您的View代码中为那些真正喜欢编码UI的用户显式设置了AutowireViewModel属性。这意味着您视图的BindingContext将被设置为其构造函数的一部分。 您已经让Prism的NavigationService为您设置了AutowireViewModel。这意味着视图的构造函数已经完成。设置属性后,将设置绑定上下文。 虽然我通常使用第二种方法来保持代码的整洁,但只有在边缘情况需要时才显式地选择第二种方法,最终选择哪种方法并不重要。此时,视图和ViewModel的构造函数都已执行,并且ViewModel被设置为视图的BindingContext,但是Prism没有调用Initialize方法

只有在调用了View和ViewModel构造函数并设置了BindingContext的情况下,Prism才会真正启动初始化过程,如您在问题中所述:

希望能更清楚地考虑下面的视图模型下面的注释< /P> 公共类SampleViewModel:IInitialize,iActivationAware { 公共样本视图模型 { //在充气SampleViewModel对象时调用 //然后将其添加为视图的BindingContext //注意:您不能从这里访问导航参数!!!! } public void InitializeINavigationParameters参数 { //在视图Xamarin.Forms页面推送到导航堆栈之前调用 } 从InAvigationParameters导航的公共void { //当视图被导航到其他位置时调用 } 导航到AvigationParameters上的公共void参数 { //在将视图导航到或返回到。。。 //初始化之后。。。 } }
Prism提供的初始化方法:

初始化。初始化 IInIAlizeAsync.InitializeAsync 自动初始化 只会被解雇一次

因为ViewModelLocator是专门选择退出而不是选择加入的,所以它有两种工作方式

您已显式设置AutowireViewModel p 为那些真正热爱编码用户界面的用户提供XAML或View代码中的属性。这意味着您视图的BindingContext将被设置为其构造函数的一部分。 您已经让Prism的NavigationService为您设置了AutowireViewModel。这意味着视图的构造函数已经完成。设置属性后,将设置绑定上下文。 虽然我通常使用第二种方法来保持代码的整洁,但只有在边缘情况需要时才显式地选择第二种方法,最终选择哪种方法并不重要。此时,视图和ViewModel的构造函数都已执行,并且ViewModel被设置为视图的BindingContext,但是Prism没有调用Initialize方法

只有在调用了View和ViewModel构造函数并设置了BindingContext的情况下,Prism才会真正启动初始化过程,如您在问题中所述:

希望能更清楚地考虑下面的视图模型下面的注释< /P> 公共类SampleViewModel:IInitialize,iActivationAware { 公共样本视图模型 { //在充气SampleViewModel对象时调用 //然后将其添加为视图的BindingContext //注意:您不能从这里访问导航参数!!!! } public void InitializeINavigationParameters参数 { //在视图Xamarin.Forms页面推送到导航堆栈之前调用 } 从InAvigationParameters导航的公共void { //当视图被导航到其他位置时调用 } 导航到AvigationParameters上的公共void参数 { //在将视图导航到或返回到。。。 //初始化之后。。。 } }
谢谢丹这么快就回答了这个问题,你是一台机器。我想我现在明白了。继续努力!谢谢丹这么快就回答了这个问题,你是一台机器。我想我现在明白了。继续努力!