Xamarin.Forms与XAML中的Child绑定父属性

时间:2015-03-07 15:47:04

标签: mvvm xamarin.forms

我搜索了两天,找不到这个问题的答案。我有一个简单的内容页面,有一个可绑定的属性:

public partial class Page1 : ContentPage
{
    public static readonly BindableProperty MainTextProperty = BindableProperty.Create<Page1 , string>(p => p.MainText, string.Empty);

    public string MainText
    {
        get
        {
            return (string)GetValue(MainTextProperty);
        }
        set
        {
            SetValue(MainTextProperty, value);
        }
    }
}

在XAML中,我有以下代码:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Test.Pages.Page1">
<Grid HorizontalOptions="Fill" VerticalOptions="Fill">
<Grid.RowDefinitions>
  <RowDefinition Height="*" />
  <RowDefinition Height="*" />
  <RowDefinition Height="*" />
  <RowDefinition Height="*" />
</Grid.RowDefinitions>

<Label Text="{Binding MainText}" Grid.Row="0"/>    
<Label Text="{Binding MainText}" Grid.Row="1"/>
<Label Text="{Binding MainText}" Grid.Row="2"/>
<ctrl:CustomControl CustomProperty="{Binding MainText}" />
<Label Text="{Binding MainText}" Grid.Row="3"/>
</Grid>
</ContentPage>

在自定义控件中,就是这样:

<StackLayout>
   <Label x:Name="lbl1" />
</StackLayout>

在代码Behind中,我使用OnPropertyChanged设置CustomProperty和lbl1之间收到的值。 CustomProperty的定义方式与我定义MainTextProperty的方式相同。

但是,这不起作用。我寻找任何可以让我做这样的事情的例子,但我还没找到。你们中的任何人都知道如何才能完成这样的事情吗?我收到的问题是我传递的值和Xamarin.Forms.Binding之间的类型不匹配。

3 个答案:

答案 0 :(得分:0)

您是否忘了添加BindingContext?我在下面尝试了它的工作原理

    public Page1 ()
    {
        InitializeComponent ();

        BindingContext = this;
        MainText = "123";
    }

我看到您的课程被命名为 Page1 ,然后Declarer中的BindableProperty也应 Page1 而不是 HomePage

public static readonly BindableProperty MainTextProperty = BindableProperty.Create<Page1, string>(p => p.MainText, string.Empty);

答案 1 :(得分:0)

另一种方法是使用x:Reference。在这种情况下,您无法更新页面的数据上下文。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="App1.Page1"
             x:Name="root">
  <Grid HorizontalOptions="Fill" VerticalOptions="Fill">
    <Grid.RowDefinitions>
      <RowDefinition Height="*" />
      <RowDefinition Height="*" />
      <RowDefinition Height="*" />
      <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Label Text="{Binding MainText}" Grid.Row="0"/>
    <Label Text="{Binding MainText}" Grid.Row="1"/>
    <Label Text="{Binding MainText}" Grid.Row="2" BindingContext="{x:Reference Name=root}"/>
    <Label Text="{Binding MainText}" Grid.Row="3"/>
  </Grid>
</ContentPage>

答案 2 :(得分:0)

我在这个问题上奋斗了一段时间并发现返回的绑定类型不是字符串它应该绑定 BTW BindableProperties与泛型类型已弃用,所以你的代码应该是这样的:

public partial class Page1 : ContentPage
{
    public static readonly BindableProperty MainTextProperty = BindableProperty.Create("MainText",typeof(Binding), typeof(Page1),null);

    public Binding MainText
    {
        get
        {
            return (Binding)GetValue(MainTextProperty);
        }
        set
        {
            SetValue(MainTextProperty, value);
        }
    }
}