带Xamarin.Forms的棱镜-如何自动连接另一个ContentView中的ContentView



当ContentView直接包含在页面中时,我们成功地将ContentView连接到它们的ViewModel,使用类似XAML的:

<local:AwesomeView mvvm:ViewModelLocator.AutowirePartialView=”{x:Reference self}” />

其中self是父页面。

但是,我们有包含ContentViews的ContentViews,并且对嵌套视图使用AutoWirePartialView是不起作用的。ContentViews不会连接到它们的ViewModel。

查看棱镜代码:

  1. AutoWirePartialView具有注释"此API已过时,将在8.0预览期间删除">
  2. AutoWirePartialView的属性更改处理程序显式检查父级是否为页面,因此无法使用父级ContentView

所以从Prism代码中可以清楚地看出为什么这不起作用!

有没有办法用棱镜来实现这一点?

版本:Xamarin.Forms-4.4.0.991265

棱镜-7.1.0.431

局部视图确实已经过时了。它被淘汰的原因是我们正在为Prism 8提供Region支持。局部视图一直被认为是一个快速而临时的解决方案,有助于弥合差距,直到我们开始为Prism.Forms实现Regions。Regions的功能要强大得多,可以让你做更多的事情,比如嵌套和懒惰地加载视图。

现实地说,嵌套区域的概念,你有:

ComponentViewA,它有自己的ViewModel。

然后你有了ComponentViewB,它有自己的ViewModel,并将ComponentViewA作为子

ComponentViewA本身就是AwesomePage 的子代

听起来这是您想要支持的一般概念。因此,简短的答案是,在棱镜7中没有好的方法来做到这一点。当然也有一些技巧,比如你可以将页面作为参数传递,并在代码后面设置属性,比如:

public class ComponentViewB : ContentView
{
public static readonly BindableProperty ParentPageProperty =
BindableProperty.Create(nameof(ParentPage), typeof(Page), typeof(ComponentViewB), null, propertyChanged: OnParentPageChanged);
private static void OnParentPageChanged(BindableObject bindable, object oldValue, object newValue)
{
// This guards the action from being performed more than once.
if(oldValue is null && newValue != null && bindable is ComponentViewB view)
{
// This assumes you've set the property x:Name="componentViewA"
// for your ComponentViewA in XAML
ViewModelLocator.SetAutowirePartialView(view.componentViewA, (view.ParentPage);
}
}
public Page ParentPage
{
get => (Page)GetValue(ParentPageProperty);
set => SetValue(ParentPageProperty, value);
}
}

老实说,如果我今天必须做一些事情,我建议这样做。一旦我们合并了我上面提到的PR,我建议你更新到预览并迁移到使用Regions。

我的观点是,为了保持干净,使用默认的棱镜方法,只将视图模型绑定到相应的页面,而不绑定到任何子视图。

与页面内组件的任何绑定都应该通过页面视图模型上的属性进行,这样无论内容视图在显示层次结构中的深度如何,都可以实现绑定。

例如:

您页面的视图模型

public class PageAViewModel : ViewModelBase
{
public ContentViewAViewModel ContentViewViewModel
{
get { return _contentViewViewModel; }
set { SetProperty(ref _contentViewViewModel, value); }
}
}

您的页面视图

<?xml version="1.0" encoding="UTF-8"?>
<views:BasePage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:components="clr-YourProject.Components"
xmlns:views="clr-YourProject.Views"
x:Class="YourProject.Views.PageA">
<Grid RowSpacing="0">
<Grid RowSpacing="0">
<components:ContentViewA BindingContext="{Binding ContentViewViewModel}"/>
</Grid>
</Grid>
</views:BasePage>

相关内容

  • 没有找到相关文章

最新更新