首页 > 解决方案 > 如何设置 MasterDetailPage.Master 的 BindingContext

问题描述

我有一个 MasterDetailPage.Master 和一个登录页面。登录后,我调用一个 WebService,它向我返回一个填充的类,它的工作,甚至 BindingContext 都在获取值,但页面上的字段是空的。如果 MasterDetailPage.Master 在登录页面之前呈现,如何设置它的绑定上下文?

这是用于 MasterDetailPage.Master 中的配置文件页面,使用 WebService 填充绑定。我已经尝试在登录页面的 OnDesappearing 上调用 MasterDetailPage 的新实例,但没有成功。

主页.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:views="clr-namespace:HCTaNaMao.Views"
                x:Class="HCTaNaMao.Views.MainPage">

        <MasterDetailPage.Master>
            <views:InformacoesUsuario />
        </MasterDetailPage.Master>

        <MasterDetailPage.Detail>
            <NavigationPage>
                <NavigationPage.Icon>
                    <OnPlatform x:TypeArguments="FileImageSource">
                        <On Platform="iOS" Value="tab_feed.png"/>
                    </OnPlatform>
                </NavigationPage.Icon>
                <x:Arguments>
                    <views:Menu />
                </x:Arguments>
            </NavigationPage>
        </MasterDetailPage.Detail>
    </MasterDetailPage>

MasterDetailPage.Master.xaml


    <?xml version="1.0" encoding="utf-8" ?>
    <TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="HCTaNaMao.Views.InformacoesUsuario"
                 Title="Dados do Usuário">
        <TabbedPage.Children>
            <ContentPage Title="Usuário">
                <StackLayout Padding="0,50,0,0">

                <Image BackgroundColor="LightGray" HorizontalOptions="Center" Source="HC_logo.png"></Image>

                <Frame 
                    OutlineColor="Silver" 
                    VerticalOptions="CenterAndExpand" 
                    HorizontalOptions="Fill" 
                    Margin="15">
                    <StackLayout 
                        HorizontalOptions="Center"
                        VerticalOptions="Center">

                        <Label x:Name="lblNome" Text="{Binding nome}" FontSize="18" HorizontalTextAlignment="Center"></Label>
                        <BoxView Color="Gray" HeightRequest="1" HorizontalOptions="Fill"/>
                        <Label x:Name="lblProntuario" Text="{Binding prontuario}" FontSize="18" HorizontalTextAlignment="Center"></Label>
                        <BoxView Color="Gray" HeightRequest="1" HorizontalOptions="Fill"/>
                            <Button x:Name="btnEditar" Text="Perfil" TextColor="White" WidthRequest="110" 
                HorizontalOptions="Center" BackgroundColor="SteelBlue" BorderRadius="20"/>
                    </StackLayout>
                </Frame>
                </StackLayout>
            </ContentPage>
            <ContentPage Title="Perfil">
                <Frame 
                    OutlineColor="Silver" 
                    VerticalOptions="CenterAndExpand" 
                    HorizontalOptions="Fill" 
                    Margin="15">
                    <StackLayout>
                        <TableView>
                            <TableRoot>
                                <TableSection Title="Dados Pessoais">
                                    <EntryCell x:Name="cellNome" Placeholder="Nome"
                                        Text="{Binding nome}" IsEnabled="True"></EntryCell>
                                    <EntryCell Placeholder="Data de Nascimento"  x:Name="cellNasc"
                                        Text="{Binding data_nascimento}" IsEnabled="True"></EntryCell>
                                    <EntryCell Placeholder="CPF" Keyboard="Numeric" x:Name="cellCpf" 
                                        Text="{Binding cpf}" IsEnabled="True"></EntryCell>
                                    <EntryCell Placeholder="CNS" Keyboard="Numeric"  x:Name="cellCns"
                                        Text="{Binding cns}" IsEnabled="True"></EntryCell>
                                </TableSection>
                            </TableRoot>
                        </TableView>
                        <Button Text="Editar" 
                                IsVisible="False">
                        </Button>
                        <Button x:Name="btnSalvar"
                                Text="Salvar" 
                                IsVisible="True" TextColor="White" WidthRequest="110" 
                HorizontalOptions="Center" BackgroundColor="SteelBlue" BorderRadius="20"></Button>
                    </StackLayout>
                </Frame>
            </ContentPage>
        </TabbedPage.Children>
    </TabbedPage>

MaterDetailPage.xaml.cs


    namespace HCTaNaMao.Views
    {
        [XamlCompilation(XamlCompilationOptions.Compile)]
        public partial class InformacoesUsuario : TabbedPage
        {
            HCTMWebService service = new HCTMWebService();
            HCTMPacienteDTO paciente;
            public InformacoesUsuario ()
            {           
                InitializeComponent();
                btnEditar.Command = new Command(() => this.CurrentPage = this.Children[1]);
                btnSalvar.Command = new Command(() => this.CurrentPage = this.Children[0]);

                paciente = service.InformacoesPaciente(Login.seq_cliente);

                BindingContext = paciente;


            }

        }
    }

我希望 MasterPage 字段由 Binding 填充

标签: xamarinxamarin.formsxamarin.androidxamarin.ios

解决方案


如果 MasterDetailPage.Master 在登录页面之前呈现,如何设置它的绑定上下文?

关于 MasterDetailedPage.Master 的绑定上下文,我做了一个示例,你可以看看:

主页:

<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms" 
              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
              xmlns:local="clr-namespace:MasterDetailPageNavigation;assembly=MasterDetailPageNavigation"
              x:Class="MasterDetailPageNavigation.MainPage">
 <MasterDetailPage.Master>
<local:MasterPage x:Name="masterPage" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
    <NavigationPage>
        <x:Arguments>
            <local:ContactsPage />
        </x:Arguments>
    </NavigationPage>
</MasterDetailPage.Detail>
</MasterDetailPage>

 public partial class MainPage : MasterDetailPage
{
    public MainPage()
    {
        InitializeComponent();

        masterPage.listView.ItemSelected += OnItemSelected;

        if (Device.RuntimePlatform == Device.UWP)
        {
            MasterBehavior = MasterBehavior.Popover;
        }
    }

    void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        var item = e.SelectedItem as MasterPageItem;
        if (item != null)
        {
            Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
            masterPage.listView.SelectedItem = null;
            IsPresented = false;
        }
    }
}

母版页:

我不明白你的masterPage为什么是TabbedPage,我认为它应该是contentpage,它有Listview来显示详细的页面标题。

<ContentPage
x:Class="MasterDetailPageNavigation.MasterPage"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="using:MasterDetailPageNavigation"
Title="Personal Organiser"
Padding="0,40,0,0"
IconImageSource="hamburger.png">
<StackLayout>
    <ListView
        x:Name="listView"
        x:FieldModifier="public"
        ItemsSource="{Binding items}">         
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid Padding="5,10">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="30" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <Image Source="{Binding IconSource}" />
                        <Label Grid.Column="1" Text="{Binding Title}" />
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

public partial class MasterPage : ContentPage
{
    public ObservableCollection<MasterPageItem> items { get; set; }
    public MasterPage()
    {
        InitializeComponent();

        //load data from service or other.
        items = new ObservableCollection<MasterPageItem>()
        {
            new MasterPageItem(){ Title="Contacts", IconSource="contacts.png",TargetType=typeof(ContactsPage)},
            new MasterPageItem(){Title="TodoList",IconSource="todo.png",TargetType=typeof(TodoListPage)},
            new MasterPageItem(){Title="Reminders",IconSource="reminders.png",TargetType=typeof(ReminderPage)}
        };
        this.BindingContext = this;
    }
}

关于MasterDetailedPage,建议大家可以看看:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/master-detail-page


推荐阅读