XAML 自定义控件绑定上未激发Dotnet Maui DataTrigger

uajslkp6  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(146)

我创建了一个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>
qq24tv8q

qq24tv8q1#

我找到了自己的答案。我将在这里与其他人分享。我缺少的是在我的自定义控件中实现INotifyPropertyChanged。如下所示:

public class ValidatableEntry : ContentView, INotifyPropertyChanged
{
    [...]
    public bool IsValid
    {
        get { return isValid; }
        set
        {
            isValid = value;
            NotifyPropertyChanged();
        }
    }
    [...]
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

编辑:实际上,这种方法后来在我的控件上使用DataBindings时出现了问题。实际上没有必要实现INotifyPropertyChanged,因为ContentView已经实现了它。我所需要做的就是在更新值后调用OnPropertyChanged()。
所以更好更简单的答案应该是:

public class ValidatableEntry : ContentView
{
    [...]
    public bool IsValid
    {
        get { return isValid; }
        set
        {
            isValid = value;
            OnPropertyChanged();
        }
    }

相关问题