我創建了一個自定義控制元件,它是一個 ValidatableEntry。它有一個 IsValid 公共屬性 (bool)。我想使用此屬性來啟用/禁用按鈕。為此,我認為我應該能夠使用 DataTrigger。但是它不起作用。當 IsValid 屬性更改時,觸發器不會觸發。
這是說明問題的簡化版本。當輸入的文本長度超過 5 個字符時,IsValid 屬性更改為 true。但是,觸發器不會被觸發,并且按鈕保持禁用狀態。
可以在此處找到示例 repo: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>
uj5u.com熱心網友回復:
我找到了自己的答案。我會在這里分享給后來的其他人。我缺少的是在我的自定義控制元件中實作 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();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/513554.html
下一篇:屬性更新不會觸發系結值更新
