xamarin - 如何设置 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 填充
解决方案
如果 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,建议大家可以看看:
推荐阅读
- c# - 无法显示:显示警报
- google-tag-manager - GTM 指示 GA 标签“仍在运行”
- c# - WCF c#中自定义类的传输问题
- javascript - 如何在 ng-circle-progress imageSrc 选项中附加图像?
- flutter - Flutter - TextField 焦点更改 TabBar 选定索引
- reactjs - eslint在 React内部失败
- apache-kafka-streams - Rocksdb 压缩未触发或未发生
- yii2 - 调用未定义的方法 app\models\User::instance() 设置 kartik 导出 yii2
- git - git 将当前文件夹内容推送到远程 git repo 的子文件夹
- docker - Ansible Docker exec 失败,路径中找不到 docker?