ControlTemlate命令绑定

问题描述 投票:0回答:1

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。

xamarin.forms controltemplate commandbinding
1个回答
1
投票

BindableProperty.Create()方法的第一个参数必须为"LeftButtonTemplateCommand"而不是"LeftButtonCommand"。属性名称必须完全匹配才能使绑定工作。

© www.soinside.com 2019 - 2024. All rights reserved.