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