0

没有找到我要找的东西。任何 android / iPhone 类型开发的新手,但在控件模板、样式和使用 xaml 方面具有 WPF 经验。

这是我正在尝试完成但无法完全使用绑定的示例图像。我有一个控制模板,它给了我最上面的图像。顶部的标题/标签和右侧的 3 个按钮,然后是“ContentPresenter”。这些都独立于它们定义的基类。(为帖子简化的控制模板)

<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”的实际基类有多种

public static readonly BindableProperty…

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

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

感谢任何帮助。

解决方案欣赏

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

x:Name=myCommonControl

指的是创建的类的特定实例。从那里,我可以通过以下方式将特定的内部控制绑定到该对象

<StackLayout BindingContext="{x:Reference Name=myCommonControl}" 

现在我已经正确绑定到“Name=myCommonControl”已知的类实例,我可以引用该类实例的任何属性,从而通过

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

内部控件将按预期动态显示/隐藏。太感谢了。

4

1 回答 1

1

首先在您的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>

这是你想要的吗 ?

于 2019-08-16T08:47:23.137 回答