Xamarin 有条件地显示在派生的 ControlTemplate ContentPresenter 中

Xamarin conditionally show in derived ControlTemplate ContentPresenter

不太找到我要找的东西。任何 android / iPhone 类型开发的新手,但确实具有 WPF 控件模板、样式和使用 xaml.

的经验

这是我正在尝试完成但无法完全让它与绑定一起工作的示例图像。我有一个控制模板,可以给我顶部图像。顶部的 header/label 和右侧的 3 个按钮,然后是 "ContentPresenter"。这些都独立于它们定义的基础 class 。 (为 post 简化的控制模板)

<ControlTemplate x:Key="MyCommonTemplate" >
    <StackLayout>
        <StackLayout Orientation="Horizontal">
            <Label Text="{TemplateBinding Title}" />
            <Button Text="x" />
            <Button Text="y" />
            <Button Text="z" />
        </StackLayout>

        <ContentPresenter/>
    </StackLayout>
</ControlTemplate>

<Style TargetType="{x:Type myApp:MyCommonControl}" x:Key="MyCommonStyle">
    <Style.Setters>
        <Setter Property="ControlTemplate" Value="{StaticResource MyCommonTemplate}" />
    </Style.Setters>
</Style>

现在,顶部示例模板下方的两张图片。这些中的每一个都派生自顶级模板,但是它们中的每一个都有自己的内部内容,其中表示内容呈现器。如图所示,第一个派生控件始终显示其内容,但在第二个派生控件中,它有两个部分。一个始终显示,另一个有条件地显示。

这将代表来自同一控件模板的第一个派生控件。 Content Presenter 确实正确反映了图像显示的内部内容

<?xml version="1.0" encoding="UTF-8"?>
<myApp:MyCommonControl
    x:Class="MyApp.MySubControl1"
    ...
    xmlns:myapp="clr-namespace:MyApp">

    <!-- This properly shows within the "ContentPresenter" as expected -->
    <StackLayout>
        <Label Text="Always show..." />
        <Label Text="for this..." />
    </StackLayout>
</myApp:MyCommonControl>

现在,第二个派生控件

<?xml version="1.0" encoding="UTF-8"?>
<myApp:MyCommonControl
    x:Class="MyApp.MySubControl2"
    ...
    xmlns:myapp="clr-namespace:MyApp">

    <!-- This properly shows within the "ContentPresenter" as expected -->
    <StackLayout>
        <Label Text="Different sub-panel..." />
        <Label Text="Always show..." />
    </StackLayout>

    <StackLayout IsVisible="{TemplateBinding OkToShowThis}">
        <Label Text="This secondary sub-panel..." />
        <Label Text="Based on..." />
    </StackLayout>    
</myApp:MyCommonControl>

"MyCommonControl"的实际基数class有多种

public static readonly BindableProperty…

其中一个是bool数据类型"OkToShowThis"。对于顶部标签和公共按钮区域,它们都分别识别出在适当的时候从可见变为隐藏,所以我知道它们有效。

我的问题是从基本控件模板的 "ContentPresenter" 填充的派生控件的问题。此子控件的 "OkToShowThis" 未刷新。在这种情况下不确定正确的绑定参考。

感谢任何帮助。

解决方案欣赏

感谢 Leo Zhu 提供的解决方案,我的解释是这样的。 最外面的 xaml 其中

x:Name=myCommonControl

指的是 class 创建的特定实例。然后,我可以通过

将特定的 INNER CONTROL 绑定到该对象
<StackLayout BindingContext="{x:Reference Name=myCommonControl}" 

现在我已经正确绑定到 "Name=myCommonControl" 已知的 class 实例,我可以引用 class 实例中的任何 属性 从而完成我的需要通过

<StackLayout BindingContext="{x:Reference Name=myCommonControl}" 
    IsVisible="{Binding OkToShowThis}">

并且内部控件将按预期动态 show/hide。 非常感谢。

首先在您的 MyCommonControl 中您可以定义 BindableProperty OkToShowThis:

public static readonly BindableProperty OkToShowThisProperty = BindableProperty.Create("OkToShowThis", typeof(bool), typeof(MyCommonControl), true);
public bool OkToShowThis
    {
        get { return (bool)GetValue(OkToShowThisProperty); }
    }

然后在你的第二个派生控件中:

<?xml version="1.0" encoding="UTF-8"?>
<myApp:MyCommonControl
    x:Class="MyApp.MySubControl2"
    ...
    xmlns:myapp="clr-namespace:MyApp"
    OkToShowThis ="False"   
    x:Name="myCommonControl"
    >

   <!-- This properly shows within the "ContentPresenter" as expected -->
   <StackLayout>
      <Label Text="Different sub-panel..." />
      <Label Text="Always show..." />        
      <StackLayout BindingContext="{x:Reference Name=myCommonControl}"  IsVisible="{Binding OkToShowThis}">
         <Label Text="This secondary sub-panel..." />
         <Label Text="Based on..." />
      </StackLayout> 
   </StackLayout>

这是你想要的吗?