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

时间:2018-04-18 14:36:40

标签: c# forms xaml xamarin mvvm-light

我有一个带有一些控件和自定义navigationcontrol(ContentView)的ContentPage。 contentpage和navigationcontrol都有各自的ViewModel,它们的BindingContext设置为。现在我需要将信息从页面传递给navigationControl。

我尝试了什么:

 <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>

Page是我的navigationControl中的自定义BindingProperty。该属性有效,但BindingContext错误,它尝试绑定到navigationcontrol的ViewModel中的“Page”属性。

如果我改变它:

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

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

我的方法完全错了吗?我应该使用MessagingCenter吗?我对Xamarin Forms很新。谁能告诉我如何正确地做到这一点?

1 个答案:

答案 0 :(得分:0)

对于任何绊倒类似问题的人来说,这就是我解决它的方式。我对解决方案并不完全满意,但它确实有效:

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

NavigationViewModel = App.VmLocator.PageNavigationViewModel;

在xaml中我将自定义控件的BindingContext设置为Property:

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

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