Microsoft documentation显示了如何从ControlTemplate继承并使用ContentPresenter。
它显示了如何使用字符串属性在模板中填充字符串绑定的项目。 (例如HeaderText)
它没有显示如何使用命令执行相同的操作。我想通过实现contentpage / viewmodel驱动模板中按钮的命令行为。
下面的属性示例中,我使用ICommand尝试了相同的操作,但被忽略了。这意味着该按钮未执行提供的命令。不支持命令吗?
示例这在我的ControlTemplate中,称为ApplicationChrome.xaml
<Label Grid.Row="0"
Margin="20,0,0,0"
Text="{TemplateBinding HeaderText}"
TextColor="White"
FontSize="Title"
VerticalOptions="Center"/>
<Button Grid.Column="0"
x:Name="LeftButton"
Margin="20,0,0,0"
Text="Change Label"
TextColor="White"
HorizontalOptions="Start"
VerticalOptions="Center"
Command="{TemplateBinding LeftButtonTemplateCommand}"
后面的代码定义了两个可绑定属性
public static readonly BindableProperty HeaderTextProperty = BindableProperty.Create("HeaderText", typeof(string), typeof(ContentPage), null, BindingMode.TwoWay);
public string HeaderText
{
get => (string)GetValue(HeaderTextProperty);
set => SetValue(HeaderTextProperty, value);
}
public static readonly BindableProperty LeftButtonTemplateCommandProperty = BindableProperty.Create("LeftButtonCommand", typeof(ICommand), typeof(ApplicationChrome), null);
public ICommand LeftButtonTemplateCommand
{
get => (ICommand) GetValue(LeftButtonTemplateCommandProperty);
set => SetValue(LeftButtonTemplateCommandProperty, value);
}
我的实现视图同时设置了两个可绑定对象
<core:ApplicationChrome xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:core="clr-namespace:FEOD.Core;assembly=FEOD"
mc:Ignorable="d"
HeaderText="FE | Home"
LeftButtonTemplateCommand="{Binding LeftButtonCommand}"
x:Class="FEOD.Views.HomeView">
[实现视图的BindingContext被设置为其定义LeftButtonCommand的视图模型
public ICommand LeftButtonCommand { get; private set; }
private static void OnLeftButtonClicked(object obj)
{
var a = 1;
}
public HomeViewModel()
{
LeftButtonCommand = new Command(OnLeftButtonClicked);
}
绑定的HeaderText显示“ FE | Home”就好了。但是绑定的命令永远不会触发OnLeftButtonClicked。
BindableProperty.Create()方法的第一个参数必须为"LeftButtonTemplateCommand"
而不是"LeftButtonCommand"
。属性名称必须完全匹配才能使绑定工作。