.NET Maui自定义控件绑定DataTrigger未触发问题
我创建了名为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
相关产品推荐
相关产品推荐

