ContentPresenter 中的 Xamarin Forms 绑定

Xamarin Forms binding within ContentPresenter

我使用 ControlTemplate 创建了一个自定义控件。在控件模板中我使用了两个 ContentPresenters。

一个绑定到基础 class (ContentView) 的 Content-属性,另一个绑定到 [=15= 类型的 OtherContent-属性 ].

MyControl.xaml.cs

public static readonly BindableProperty ReadonlyContentProperty = BindableProperty.Create("ReadonlyContent", typeof(View), typeof(ActivatableContent), propertyChanged: OnReadonlyContentChanged);

MyControl.xaml

<ContentView x:Class="MyControl">
   <ContentView.ControlTemplate>
      <...some other stuff>
      <ContentPresenter x:Name="CPOther" Content="{TemplateBinding OtherContent}" />
      <ContentPresenter x:Name="CPBase" Content="{TemplateBinding Content}" />
   </ContentView.ControlTemplate>
</ContentView>

现在,当使用控件时,只有 ContentPresenter 中绑定到基础 classes 内容 (CPBase) 的绑定有效。 CPOther 内容中的绑定无效。

<MyControl>
    <MyControl.OtherContent>
        <!-- Binding not working -->
        <Label Text="{Binding SomeBinding}" />
    </MyControl.OtherContent>
    <!-- Binding working -->
    <Label Text="{Binding SomeBinding}" />
</MyControl> 

我猜它不起作用,因为 CPOther 的 BindingContext 丢失了。那是对的吗? 谁能告诉我如何解决 "fix" 这个问题?或者它甚至是 XF 中的错误?


using System;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Com.Tanken.Xamarin.Forms.Controls
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    [ContentProperty("Content")]
    public partial class ActivatableContent : ContentView
    {
        public static readonly BindableProperty IsReadonlyProperty = BindableProperty.Create("IsReadonly", typeof(bool), typeof(ActivatableContent), true);

        public static readonly BindableProperty ReadonlyContentProperty = BindableProperty.Create("ReadonlyContent", typeof(View), typeof(ActivatableContent));

        public bool IsReadonly
        {
            get { return (bool)GetValue(IsReadonlyProperty); }
            set { SetValue(IsReadonlyProperty, value); }
        }

        public View ReadonlyContent
        {
            get
            {
                return (View)GetValue(ReadonlyContentProperty);
            }
            set { SetValue(ReadonlyContentProperty, value); }
        }

        public ActivatableContent()
        {
            InitializeComponent();
        }

        private void OnToggleIsReadonly(object sender, EventArgs e)
        {
            IsReadonly = !IsReadonly;
        }
    }
}

似乎我是在假设这是因为丢失或未设置 BindingContext 的情况下写的。我可以通过将以下代码添加到控件来 "solve" 它:

protected override void OnBindingContextChanged()
{
    base.OnBindingContextChanged();
    var controlTemplate = ControlTemplate;
    if (ReadonlyContent != null && controlTemplate != null)
    {
        SetInheritedBindingContext(ReadonlyContent, BindingContext);
    }
    if (WritableContent != null && controlTemplate != null)
    {
        SetInheritedBindingContext(WritableContent, BindingContext);
    }
}

现在另一个问题发生在一个 ControlTemplate 中的多个 ContentPresenter 上,但我解决了这个问题,只使用了一个 ContentPresenter 并更改了它的内容。