如何在ContentView更改时动态更改导航栏标题?

时间:2017-08-23 08:30:37

标签: xamarin.forms

我正在使用Xamarin.Forms开发一个新的非常基本的应用程序,我有一个疑问...我无法弄清楚如何做到这一点,因为我根本没有使用Xamarin的经验。

根据我点击的标签,我得到ContentPage ContentView根据哪个Title="[introduce any title]"更新导航标题很容易,因为我可以使用<ContentPage ... xmlns:views="clr-namespace:Your.Name.Space" ...>' 但我不知道t在视图上有这个属性。

这基本上是我的代码,我添加了我想添加的视图的命名空间:

<views:NameOfView />

然后在我的网页内容中,我可以像这样使用它:

import { Parent } from './locationofparent' @Component({selector: 'child'}) export class Child{ constructor(private parent: Parent) { } x:number; <!-- may be some code to send the x value // just need to have the parent read it--> <!-- Remember the value is in a method,which is onclick of a button--> ngOnInit() { this.parent.addChild(this); } onButtonClick(){ this.x=5; }

我正在使用自定义标签布局进行底部导航。

我希望你们中的任何一个人都可以用正确的方式。

感谢。

2 个答案:

答案 0 :(得分:3)

实现此方法的推荐方法是在viewmodel上使用PageTitle属性 - 该属性与当前内容视图保持同步;因此它的相应标题。

但是,如果您只想在视图级别实现此功能;然后,您可以通过在内容视图中引入绑定模式为OneWayToSource的自定义可绑定属性来实现此目的。例如:

public class NavigationView : ContentView
{
    public static readonly BindableProperty TitleProperty =
                                    BindableProperty.Create("Title",
                                        typeof(string),
                                        typeof(NavigationView),
                                        defaultValue: null,
                                        defaultBindingMode: BindingMode.OneWayToSource);

    public string Title
    {
        get => (string)GetValue(TitleProperty);
        set => SetValue(TitleProperty, value);
    }
}

并使用自引用将自定义属性绑定到ContentPage标题。例如:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
    ....
    x:Name="_self"
    Title="{Binding Path=Content.Title, Source={x:Reference _self}}">

或者,将绑定添加到自定义视图以充分利用绑定模式:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
    ...
    x:Name="_self">
    ...
    <local:NavigationView Title="{Binding Path=Title, Source={x:Reference _self}}">

用法示例

XAML:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:TitleView" 
    x:Class="TitleView.TitleViewPage"
    x:Name="_self"
    Title="{Binding Path=Content.Title, Source={x:Reference _self}}">
    <local:NavigationView Title="This is page-1">
        <Button Text="Go to page-2" Clicked="Handle_Clicked" />
    </local:NavigationView>
</ContentPage>

代码隐藏:

public partial class TitleViewPage : ContentPage
{
    void Handle_Clicked(object sender, System.EventArgs e)
    {
        this.Content = new NavigationView { 
            Title = "This is page-2", 
            Content = new Button { Text = "Go back to page-1", IsEnabled = false } };
    }

    public TitleViewPage()
    {
        InitializeComponent();
    }
}

enter image description here

编辑1:还添加了一些代码来说明如何定义从内容视图到页面的绑定。

答案 1 :(得分:1)

正如Gerarld Versluis所说,你必须在ContentPage上设置标题。只需为每个标签ContentPage创建两个ContentPage。然后为每个ContentPage创建Binding。

<ContentPage Title="{Binding PageTitleFirstPage}" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="stackoverflow.AboutPage" xmlns:vm="clr-namespace:stackoverflow;">
</ContentPage>

对于第二个ContentPage,如果需要,您也可以在ContentPage中使用ContentView!

<ContentPage Title="{Binding PageTitleSecondPage}" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="stackoverflow.AboutPage" xmlns:vm="clr-namespace:stackoverflow;">
</ContentPage>

在ViewModel中设置一个包含所需字符串的属性:

public string PageTitleSecondPage => "Second Tab";

<强>更新 我读到你想通过在ContentViews之间切换来改变标题。你能告诉我们你的代码吗?因为您可以轻松地将PageTitle设置在ContentView切换的位置。我们假设您正在通过Click切换ContentView,您可以设置PageTitle。但您还必须通知View,此属性已更改。