Мультитриггеры

Последнее обновление: 19.12.2022

Мультитриггеры (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" />
мультитриггеры данных MultiTrigger в .NET MAUI и C#

Таким образом, пользователь должен ввести либо свой 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 }
            };
        }
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850