我创建了一个ValidatableEntry自定义控件。它具有IsValid公共属性(bool)。我希望使用此属性启用/禁用按钮。为此,我认为应该能够使用DataTrigger。但是,它不起作用。IsValid属性更改时,触发器不激发。
以下是说明此问题的 * 简化 * 版本。当输入的文本长度超过5个字符时,IsValid属性将更改为true。但是,不会触发触发器,按钮保持禁用状态。
以下是一个示例存储库:https://github.com/jokogarcia/ExampleForSO
自订控件:
public class ValidatableEntry : ContentView
{
public Entry Entry { get; set; } = new();
public int MinimumLength { get; set; }
public bool IsValid { get; set; }
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文件:
<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>
1条答案
按热度按时间qq24tv8q1#
我找到了自己的答案。我将在这里与其他人分享。我缺少的是在我的自定义控件中实现INotifyPropertyChanged。如下所示:
编辑:实际上,这种方法后来在我的控件上使用DataBindings时出现了问题。实际上没有必要实现INotifyPropertyChanged,因为ContentView已经实现了它。我所需要做的就是在更新值后调用OnPropertyChanged()。
所以更好更简单的答案应该是: