You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI中ControlTemplate内UserStoppedTypingBehavior的SearchCommand不触发问题

问题解决:.NET MAUI自定义搜索控件SearchCommand不触发的修复方案

核心问题分析

你的问题根源在于:

  1. ControlTemplate内部的绑定作用域与外部页面不同,直接使用Binding Path=BindingContext.SearchCommand无法正确定位到Page的ViewModel;
  2. 自定义SearchField控件未暴露SearchCommand依赖属性,导致之前尝试TemplateBinding时抛出异常。

以下是分步修复方案:

1. 给自定义SearchField添加SearchCommand依赖属性

修改SearchField.cs,新增绑定属性以暴露搜索命令:

public class SearchField : MobileContentViewBase
{
    // 新增SearchCommand依赖属性,用于接收外部绑定的命令
    public static readonly BindableProperty SearchCommandProperty =
        BindableProperty.Create(nameof(SearchCommand), typeof(ICommand), typeof(SearchField));

    public ICommand SearchCommand
    {
        get => (ICommand)GetValue(SearchCommandProperty);
        set => SetValue(SearchCommandProperty, value);
    }

    private Entry _searchFieldEntry;
    private const string SearchFieldEntryName = nameof(_searchFieldEntry);

    protected override void AddCustomHandlers()
    {
        if (_searchFieldEntry == null)
        {
            _searchFieldEntry = this.FindChildByClassId<Entry>(SearchFieldEntryName);
        }
    }
}

2. 修改ControlTemplate中的绑定为TemplateBinding

更新App.xaml里的SearchFieldTemplate,将Behavior的Command绑定到自定义控件的SearchCommand属性:

<ControlTemplate x:Key="SearchFieldTemplate">
    <StackLayout>
        <ctrls:IconButton
            ImageSource="Search"
            BackgroundColor="Transparent" />

        <Entry
            ClassId="_searchFieldEntry"
            HorizontalOptions="FillAndExpand"
            VerticalOptions="FillAndExpand">
            <Entry.Behaviors>
                <toolkit:UserStoppedTypingBehavior
                    Command="{TemplateBinding SearchCommand}"
                    StoppedTypingTimeThreshold="1000"
                    MinimumLengthThreshold="3"
                    ShouldDismissKeyboardAutomatically="True" />
            </Entry.Behaviors>
        </Entry>
    </StackLayout>
</ControlTemplate>
<Style TargetType="ctrls:SearchField">
    <Setter Property="ControlTemplate" Value="{StaticResource Key=SearchFieldTemplate}" />
</Style>

3. 在TestPage中绑定SearchCommand

修改TestPage.xaml,将自定义控件的SearchCommand绑定到ViewModel的对应命令:

<myCtrl:SearchField
    x:Name="searchField"
    Grid.Row="0"
    HorizontalOptions="FillAndExpand"
    Placeholder="Search here..."
    SearchCommand="{Binding SearchCommand}" />

修复原理

通过给自定义控件添加依赖属性,我们建立了外部ViewModel到ControlTemplate内部Behavior的绑定桥梁:

  • 外部页面将ViewModel的SearchCommand绑定到SearchField的SearchCommand属性;
  • ControlTemplate内部通过TemplateBinding直接引用自定义控件的SearchCommand属性,确保命令能正确传递并触发。

内容的提问来源于stack exchange,提问作者Divyesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:22:38