Мультитриггеры (multitriggers), как и триггеры данных, позволяют отслеживать изменение данных. Но в отличие от триггеров данных, мультриггеры выполняют некоторые действия, если привязанные данные соответствовуют сразу набору условий. В .NET MAUI триггеры данных представлены классом MultiTrigger. Для отслеживания данных триггер использует привязку и объект Binding.
Определим простейший мультитриггер данных:
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="HelloApp.MainPage"> <StackLayout Padding="10"> <Entry x:Name="email" Text="" Margin="6" /> <Entry x:Name="phone" Text="" Margin="6"/> <Button Text="Send" TextColor="#01579B" BackgroundColor="#fff" > <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" /> <Setter Property="BackgroundColor" Value="LightGray" /> <Setter Property="TextColor" Value="Gray" /> </MultiTrigger> </Button.Triggers> </Button> </StackLayout> </ContentPage>
В данном случае триггер данных определен для элемента Button и отслеживает данные в двух текстовых полях Entry.
Для хранения условий мультитриггер имеет коллекцию Conditions, где каждый объект представляет объект BindingCondition.
Через его свойство Binding
устанавливается привязка к отслеживаемому свойству определенного объекта. А его свойство Value
указывает,
при каком значении будет срабатывать триггер.
В данном случае триггер будет срабатывать, если одновременно и в поле email, и в поле phone пустой текст:
<BindingCondition Binding="{Binding Source={x:Reference email}, Path=Text.Length}" Value="0" /> <BindingCondition Binding="{Binding Source={x:Reference phone}, Path=Text.Length}" Value="0" />
Таким образом, пользователь должен ввести либо свой email, либо номер своего телефона.
Аналогичный мультитриггер в коде C#:
namespace HelloApp { class StartPage : ContentPage { public StartPage() { Entry email = new Entry { Text = "", Margin = 10 }; Entry phone = new Entry { Text = "", Margin = 10 }; Button button = new Button { BackgroundColor = Color.FromArgb("#fff"), TextColor = Color.FromArgb("#01579B"), Text = "Save", Margin = 10 }; // определяем триггер данных MultiTrigger multiTrigger = new MultiTrigger(typeof(Button)); // добавляем условия триггера multiTrigger.Conditions.Add(new BindingCondition { Binding = new Binding { Source = email, Path = "Text.Length" }, Value = 0 }); multiTrigger.Conditions.Add(new BindingCondition { Binding = new Binding { Source = phone, Path = "Text.Length" }, Value = 0 }); // добавляем набор сеттеров multiTrigger.Setters.Add(new Setter { Property = Button.BackgroundColorProperty, Value = Colors.LightGray }); multiTrigger.Setters.Add(new Setter { Property = Button.TextColorProperty, Value = Colors.Gray }); multiTrigger.Setters.Add(new Setter { Property = Button.IsEnabledProperty, Value = false }); // добавляем триггер к кнопке button.Triggers.Add(multiTrigger); Content = new StackLayout { Padding = 10, Children = { email, phone, button } }; } } }