Coming from my original post,我试图创建自定义控件并为其构建控件模板,就像在WPF中一样,但是在触发器上失败。向我提供了一个链接,该链接指示不允许在所有控件上使用控件模板,而在其他问题上,仅通过another S/O link provided by @Raimo允许某些控件模板。
现在进入第2部分。我将控件从“ Entry”类型更改为“ ContentView”类型,因此可以应用控件模板。所以那是唯一改变的事情
namespace MyAndroidApp
{
public class MyTextboxEntry : ContentView
{
public MyTextboxEntry()
{}
public static readonly BindableProperty IsRequiredProperty
= BindableProperty.Create(nameof(IsRequired), typeof(bool),
typeof(MyTextboxEntry), false, BindingMode.TwoWay);
public bool IsRequired
{
get { return (bool)GetValue(IsRequiredProperty); }
set { SetValue(IsRequiredProperty, value); }
}
}
}
命名空间引用..
xmlns:myCtrls="clr-namespace:MyAndroidApp"
现在,转到控制模板。我实际上是在控件中定义多个部分,但此处为简单起见已将其缩写。
<ControlTemplate x:Key="CT_MyTextboxEntry" >
<!--having a grid as an outer wrapper for multiple internal controls...-->
<Grid HorizontalOptions="StartAndExpand" x:Name="UpdateThisGridControl" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150*" />
<ColumnDefinition Width="50" />
<ColumnDefinition Width="16" />
</Grid.ColumnDefinitions>
<Entry Text="Sample" Grid.Column="0" />
<Label Text="junk" Grid.Column="1" />
<Image Source="Sample.jpg" Grid.Column="2" />
<Grid.Triggers>
<Trigger TargetType="myCtrls:MyTextboxEntry" Property="IsRequired" Value="True">
<Setter Property="BackgroundColor" Value="Red"/>
</Trigger>
</Grid.Triggers>
</Grid>
</ControlTemplate>
以及要在页面中显示的控件的最终实例
<myCtrls:MyTextboxEntry ControlTemplate="{StaticResource CT_MyTextboxEntry}" />
所以,我的失败在Grid.Triggers部分中。这里的目的是使用新条目控件(基于ContentView)的bindable属性,并为“ IsRequired”使用适当的BindableProperty声明,但要设置GRID的背景颜色。
在WPF中,您可以在这里说使用此事件的触发器,但是请通过“ x:Name”引用对其进行更新,以更新控件模板中的此另一个控件,我将其适当地命名为“ UpdateThisGridControl”。
如果禁用[Grid.Triggers]部分,则控件和模板将按预期显示。一旦启用触发器,它就会失败并显示
"bindable not an instance of AssociatedType
但是,如果考虑到ContentView条目具有背景色属性,并且Grid控件也具有该属性,为什么在尝试通过触发器进行设置时为什么会窒息?
非常感谢您对自定义控件中的属性进行这种类型的绑定以在特定控件模板中更新属性提供帮助。谢谢
如果使用Grid.Triggers
,则应像以下代码一样在TargetType="Grid"
选项卡中设置Trigger
。
<ControlTemplate x:Key="CT_MyTextboxEntry" >
<!--having a grid as an outer wrapper for multiple internal controls...-->
<Grid HorizontalOptions="StartAndExpand" x:Name="UpdateThisGridControl" IsEnabled="True" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150*" />
<ColumnDefinition Width="50" />
<ColumnDefinition Width="16" />
</Grid.ColumnDefinitions>
<Entry Text="Sample" Grid.Column="0" />
<Label Text="junk" Grid.Column="1" />
<Image Source="Sample.jpg" Grid.Column="2" />
<!--For Testing, I set the value of `Property` is `IsEnabled`, it worked as normal -->
<Grid.Triggers>
<Trigger TargetType="Grid" Property="IsEnabled" Value="True">
<Setter Property="BackgroundColor" Value="Red"/>
</Trigger>
</Grid.Triggers>
</Grid>
</ControlTemplate>
但是您想将TargetType="myCtrls:MyTextboxEntry"
设置为Trigger
,
您可以尝试使用Style来实现myCtrls:MyTextboxEntry
。
<ContentPage.Resources>
<ResourceDictionary>
<Style TargetType="myCtrls:MyTextboxEntry">
<Style.Triggers>
<Trigger TargetType="myCtrls:MyTextboxEntry"
Property="IsRequired" Value="True">
<Setter Property="BackgroundColor" Value="Red" />
<!-- multiple Setters elements are allowed -->
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
<ControlTemplate x:Key="CT_MyTextboxEntry" >
<!--having a grid as an outer wrapper for multiple internal controls...-->
<Grid HorizontalOptions="StartAndExpand" x:Name="UpdateThisGridControl" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150*" />
<ColumnDefinition Width="50" />
<ColumnDefinition Width="16" />
</Grid.ColumnDefinitions>
<Entry Text="Sample" Grid.Column="0" />
<Label Text="junk" Grid.Column="1" />
<Image Source="Sample.jpg" Grid.Column="2" />
<!--<Grid.Triggers>
<Trigger TargetType="Grid" Property="IsEnabled" Value="True">
<Setter Property="BackgroundColor" Value="Red"/>
</Trigger>
</Grid.Triggers>-->
</Grid>
</ControlTemplate>
</ContentPage.Resources>
<StackLayout>
<myCtrls:MyTextboxEntry ControlTemplate="{StaticResource CT_MyTextboxEntry}" IsRequired="True" />
</StackLayout>
这里正在运行屏幕截图。