如何使用 mvvmLight 将数据从 ContentPage ViewModel 传递到 Xamarin Forms 中的 ContentView Viewmodel?

How to pass data from ContentPage ViewModel to ContentView Viewmodel in Xamarin Forms with mvvmLight?

我有一个包含一些控件和自定义导航控件 (ContentView) 的 ContentPage。 contentpage 和 navigationcontrol 都有各自的 ViewModels,它们的 BindingContext 被设置为。现在我需要将信息从页面传递到导航控件。

我尝试了什么:

 <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:controls="clr-namespace:AuditApp.Controls;assembly=App"
                 x:Class="App.Pages.MyPage"
                 x.Name="contentpage">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="9*"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            ...other controls...
            <controls:PageNavigationControl Grid.Row="1" Page="{Binding Page}"/>
        </Grid>
    </ContentPage>

页面是我的导航控件中的自定义绑定属性。 属性 有效,但 BindingContext 是错误的,它试图绑定到导航控件的 ViewModel 中的 "Page" 属性。

如果我这样改:

<controls:PageNavigationControl Grid.Row="1" Page="{Binding Page}" BindingContext="{x:Relative Name=contentpage"}/>

那么它也不起作用,因为它试图绑定到 ContentPage 本身而不是它的 ViewModel。我需要的是将它绑定到 ContentPage 的 ViewModel,它具有我要阅读的页面 属性。

是不是我的方法完全错了?我应该使用 MessagingCenter 吗?我对 Xamarin Forms 很陌生。谁能告诉我如何正确执行此操作?

对于遇到类似问题的任何人,这就是我解决它的方法。我对这个解决方案不是很满意,但它确实有效:

我在我的页面 ViewModel 中将控件 ViewModel 作为 属性 并以编程方式设置:

NavigationViewModel = App.VmLocator.PageNavigationViewModel;

在 xaml 我将自定义控件的 BindingContext 设置为 属性:

<controls:PageNavigationControl Grid.Row="1" BindingContext="{Binding NavigationViewModel}"/>

现在我可以访问我的 PageView 模型中的控件 ViewModel 并可以在那里传递我需要的数据。