Xamarin中的XAML中MasterDetailPage的数据绑定Xamarin.Forms

问题描述:

到目前为止,大多数使用Xamarin.Forms的示例都使用C#构建UI。我更喜欢使用XAML作为UI,并将其绑定到ViewModels。Xamarin中的XAML中MasterDetailPage的数据绑定Xamarin.Forms

我在使用Xamarin.Forms.MasterDetailPage与XAML结合时遇到了问题,我似乎无法将C#示例移植到XAML + ViewModels。

这是我至今为止XAML:

<?xml version="1.0" encoding="UTF-8" ?> 
<MasterDetailPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:NSContacten;assembly=NSContacten" 
    x:Class="MasterDetailExample.Main" 
    Title="Master Detail Example"> 

    <MasterDetailPage.Master BindingContext="{Binding Menu}"> 
     <ContentPage Padding="5, 25">    
      <StackLayout Orientation="Vertical"> 
       <Label Text="Master" HorizontalOptions="Center" /> 
       <Label Text="{Binding Subtitle}" HorizontalOptions="Center" /> 
      </StackLayout>  
     </ContentPage> 
    </MasterDetailPage.Master> 

    <MasterDetailPage.Detail BindingContext="{Binding Detailpage}"> 
     <ContentPage Padding="5, 25">  
      <StackLayout Orientation="Vertical"> 
       <Label Text="Detail" HorizontalOptions="Center" /> 
       <Label Text="{Binding Subtitle}" HorizontalOptions="Center" /> 
      </StackLayout>  
     </ContentPage> 
    </MasterDetailPage.Detail>  
</MasterDetailPage> 

部件的工作原理:我看到“主”和“详细信息”标签。不显示绑定标签(在BindingContext对象上)。

我已经使用了不同组合的加载,但我仍然卡住:这是如何工作的?我的绑定是不正确的(它应该在“ContentPage”上),我无法绑定到.Master和.Detail属性等。 “Menu”和“Detailpage”绑定应该如何?

如果有人能帮助我,这将是一个巨大的帮助!下一步是在.Master中按下按钮时.Detail将被更改。提前致谢!

+0

感谢您提出这个问题!我花了一天的时间试图弄清楚,我不会没有这个问题。 –

XAML中几乎是好的,但:

  • {BindingContext}上的属性无效,应在ContentPage元素
  • MasterDetailPage.Master需要一个Page.Title进行设置,或者抛出。

这里是正确的XAML的工作对我来说:

<?xml version="1.0" encoding="UTF-8" ?> 
<MasterDetailPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:NSContacten;assembly=NSContacten" 
    x:Class="MasterDetailExample.Main" 
    Title="Master Detail Example"> 

    <MasterDetailPage.Master> 
     <ContentPage Padding="5, 25" BindingContext="{Binding Menu}" Title="Master"> 
      <StackLayout Orientation="Vertical"> 
       <Label Text="Master" HorizontalOptions="Center" /> 
       <Label Text="{Binding Subtitle}" HorizontalOptions="Center" /> 
      </StackLayout> 
     </ContentPage> 

    </MasterDetailPage.Master> 

    <MasterDetailPage.Detail> 
     <ContentPage Padding="5, 25" BindingContext="{Binding Detailpage}"> 

      <StackLayout Orientation="Vertical"> 
       <Label Text="Detail" HorizontalOptions="Center" /> 
       <Label Text="{Binding Subtitle}" HorizontalOptions="Center" /> 
      </StackLayout> 

     </ContentPage> 
    </MasterDetailPage.Detail> 
</MasterDetailPage> 

我一个匿名类型的页面视图模型进行了测试:

public MyMDPage() 
{ 
    InitializeComponent(); 
    BindingContext = new { 
     Menu = new { Subtitle = "I'm Master" }, 
     Detailpage = new { Subtitle = "I'm Detail" } 
    }; 
} 

,这工作得很好。在你的情况下,你可能需要具体的类型而不是你的视图模型的匿名类型,但你明白了。

+0

谢谢Stephane,那非常棒! .Master上的Page.Title可以被删除(至少对iOS而言,没有检查过其他平台),但MasterDetailPage的“BindingContext”是我解决方案的关键。再次感谢! – MarcoK

+2

@MarcoK:如果标题不是强制性的,那么您没有运行最新版本。做一个nuget更新 –

+0

感谢一堆这个答案。虽然我在Xamarin.Forms中使用可绑定属性,但逻辑相同。 –