Xamarin.Forms
トリガーとビヘイビア
サーチ…
Xamarinフォームのトリガの例
Trigger
は、あなたのアプリケーションにいくつかのUX応答性を追加する簡単な方法です。これを行う簡単な方法の1つは、関連するEntry
にテキストが入力されているかどうかに基づいてLabel
のTextColor
を変更するTrigger
を追加することです。
このためにTrigger
を使用すると、 Label.TextColor
を灰色(テキストが入力されていない場合)から黒(ユーザーがテキストを入力するとすぐに)に変更できます。
コンバータ(各コンバータには、クラスの新しいインスタンスが使用されるたびに作成されないように、バインディングで使用されるInstance
変数が与えられます):
/// <summary>
/// Used in a XAML trigger to return <c>true</c> or <c>false</c> based on the length of <c>value</c>.
/// </summary>
public class LengthTriggerConverter : Xamarin.Forms.IValueConverter {
/// <summary>
/// Used so that a new instance is not created every time this converter is used in the XAML code.
/// </summary>
public static LengthTriggerConverter Instance = new LengthTriggerConverter();
/// <summary>
/// If a `ConverterParameter` is passed in, a check to see if <c>value</c> is greater than <c>parameter</c> is made. Otherwise, a check to see if <c>value</c> is over 0 is made.
/// </summary>
/// <param name="value">The length of the text from an Entry/Label/etc.</param>
/// <param name="targetType">The Type of object/control that the text/value is coming from.</param>
/// <param name="parameter">Optional, specify what length to test against (example: for 3 Letter Name, we would choose 2, since the 3 Letter Name Entry needs to be over 2 characters), if not specified, defaults to 0.</param>
/// <param name="culture">The current culture set in the device.</param>
/// <returns><c>object</c>, which is a <c>bool</c> (<c>true</c> if <c>value</c> is greater than 0 (or is greater than the parameter), <c>false</c> if not).</returns>
public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture) { return DoWork(value, parameter); }
public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) { return DoWork(value, parameter); }
private static object DoWork(object value, object parameter) {
int parameterInt = 0;
if(parameter != null) { //If param was specified, convert and use it, otherwise, 0 is used
string parameterString = (string)parameter;
if(!string.IsNullOrEmpty(parameterString)) { int.TryParse(parameterString, out parameterInt); }
}
return (int)value > parameterInt;
}
}
XAML(XAMLコードは、 Entry
x:Name
を使用して、 Entry.Text
プロパティで把握する長さが3文字を超えています)。
<StackLayout>
<Label Text="3 Letter Name">
<Label.Triggers>
<DataTrigger TargetType="Label"
Binding="{Binding Source={x:Reference NameEntry},
Path=Text.Length,
Converter={x:Static helpers:LengthTriggerConverter.Instance},
ConverterParameter=2}"
Value="False">
<Setter Property="TextColor"
Value="Gray"/>
</DataTrigger>
</Label.Triggers>
</Label>
<Entry x:Name="NameEntry"
Text="{Binding MealAmount}"
HorizontalOptions="StartAndExpand"/>
</StackLayout>
マルチトリガ
MultiTriggerは頻繁には必要ありませんが、非常に便利な状況がいくつかあります。 MultiTriggerは、TriggerまたはDataTriggerと同様に動作しますが、複数の条件があります。 Settersが発動するには、すべての条件が満たされていなければなりません。ここに簡単な例があります:
<!-- Text field needs to be initialized in order for the trigger to work at start -->
<Entry x:Name="email" Placeholder="Email" Text="" />
<Entry x:Name="phone" Placeholder="Phone" Text="" />
<Button Text="Submit">
<Button.Triggers>
<MultiTrigger TargetType="Button">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding Source={x:Reference email}, Path=Text.Length}" Value="0" />
<BindingCondition Binding="{Binding Source={x:Reference phone}, Path=Text.Length}" Value="0" />
</MultiTrigger.Conditions>
<Setter Property="IsEnabled" Value="False" />
</MultiTrigger>
</Button.Triggers>
</Button>
この例では、電話と電子メールの2つの異なるエントリがあり、そのうちの1つは入力する必要があります。 MultiTriggerは、両方のフィールドが空の場合に送信ボタンを無効にします。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow