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

.NET Maui自定义控件绑定DataTrigger未触发问题

问题:DataTrigger未响应自定义控件属性变化,导致Button状态不更新

我创建了名为ValidatableEntry的自定义控件,它拥有布尔类型公开属性IsValid。希望通过该属性启用/禁用Button,遂尝试使用DataTrigger,但触发器未生效:当IsValid属性变化时,触发器并未触发。

简化示例:当输入文本长度超过5个字符时,IsValid属性会变为true,但触发器未触发,按钮始终处于禁用状态。

问题原因

自定义控件中的IsValid是普通CLR属性,没有实现属性变更通知机制。MAUI的DataTrigger依赖属性变更通知来感知值的变化,因此属性更新时UI无法收到通知,触发器自然不会执行。

解决方案

将IsValid和MinimumLength改为BindableProperty(可绑定属性),这样属性值变化时会自动触发通知,DataTrigger就能正常响应状态变化了。

修改后的自定义控件代码

public class ValidatableEntry : ContentView
{
    public Entry Entry { get; set; } = new();

    // 改为可绑定属性
    public static readonly BindableProperty MinimumLengthProperty =
        BindableProperty.Create(nameof(MinimumLength), typeof(int), typeof(ValidatableEntry), defaultValue: 0);

    public int MinimumLength
    {
        get => (int)GetValue(MinimumLengthProperty);
        set => SetValue(MinimumLengthProperty, value);
    }

    // 改为可绑定属性
    public static readonly BindableProperty IsValidProperty =
        BindableProperty.Create(nameof(IsValid), typeof(bool), typeof(ValidatableEntry), defaultValue: false);

    public bool IsValid
    {
        get => (bool)GetValue(IsValidProperty);
        set => SetValue(IsValidProperty, value);
    }

    public ValidatableEntry()
    {
        this.Entry.TextChanged += OnTextChanged;
        Content = new VerticalStackLayout
        {
            Children = { Entry }
        };
    }

    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        Entry entry = sender as Entry;
        IsValid = entry?.Text?.Length > MinimumLength;
    }
}

XAML代码无需修改

原XAML中的DataTrigger绑定逻辑是正确的,修改完可绑定属性后即可正常工作:

<VerticalStackLayout
            Spacing="25"
            Padding="30,0"
            VerticalOptions="Center">

            <local:ValidatableEntry
               x:Name="MyEntry"
               MinimumLength="5"/>

            <Button
                x:Name="CounterBtn"
                Text="Click me"
                SemanticProperties.Hint="Counts the number of times you click"
                Clicked="OnCounterClicked"
                IsEnabled="False"
                HorizontalOptions="Center" >
                <Button.Triggers>
                    <DataTrigger TargetType="Button"
                                 Binding="{Binding Source={x:Reference MyEntry},
                                 Path=IsValid}"
                                 Value="True">
                        <Setter Property="IsEnabled" Value="True"></Setter>
                    </DataTrigger>
                </Button.Triggers>
            </Button>

        </VerticalStackLayout>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:35:26