ControlTemlate 命令绑定

ControlTemlate Command Binding

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);
    }

我的实现视图同时设置了 Bindables

<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"。 属性 名称必须完全匹配才能使绑定生效。