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 并更改了它的内容。
我使用 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 并更改了它的内容。