.NET Maui — возможность нейтральной привязки свойств

В .NET Maui у меня есть этот XAML:

        <Style x:Key = "GreenLabelStyle" TargetType = "Label">
            <Setter Property = "TextColor" Value = "Green"/>                      
        </Style>              

       <Label Style = "{StaticResource GreenLabelStyle}" 
              Text = "Some text"
              TextColor = "{Binding SometimesOverrideColor}"
              />

       <CheckBox IsChecked = "{Binding OverrideColorStyle}"/>

TextColor метки привязан к этому свойству:

    public Color SometimesOverrideColor
    {
        get
        {
            return OverrideColorStyle ? Colors.Pink : Colors.Green; // works, but not DRY
        }
    }

Несмотря на то, что у меня есть указанный (привязка) TextColor, я хочу, чтобы опция «игнорировала эту настройку свойства и действовала так, как будто на метке не было явного TextColor». Я попробовал вернуть null за SometimesOverrideColor, но это не сработало. Я хочу использовать значение стиля метки (т. е. зеленого цвета).

Очевидно, я могу вернуть Colors.Green в SometimesOverrideColor, но это будет повторять значение, указанное в стиле. Если бы я изменил стиль, мне пришлось бы не забыть обновить свойство.

Я имею в виду ключевое слово inherit в CSS. Если бы я мог вернуться Color.Inherit, это было бы здорово!

Это основано на каком-то условии? Если да, то почему бы не создать два стиля и применить их условно через конвертер или что-то еще.

FreakyAli 21.05.2024 05:31

@FreakyAli Да, предположим, что SometimesOverrideColor может возвращать тысячи возможных значений цвета. В некоторых случаях я хочу, чтобы он возвращал «наследовать», что означает «вести себя так, как если бы TextColor не был указан».

CarlJ 21.05.2024 05:42
SometimesOverrideColor является свойством цвета? Если да, то вы обновляете его вручную (я имею в виду, что вы делаете правильно?)
FreakyAli 21.05.2024 05:45

@CarlJ проверьте мой ответ, как очень простую альтернативу. Вы можете сделать текст розовым, если он «недействителен», и «зеленым», если он действителен. Единственным недостатком является то, что вы хотите смешать размер из стиля 1, цвет из стиля 2, шрифт из стиля 3 и так далее. Но для переключения между стилями это одна строка в вашем XAML, используя инструментарий сообщества maui.

H.A.H. 21.05.2024 16:31

Я надеялся на метод, с помощью которого TextColor можно было бы установить значение, означающее «игнорировать этот параметр». Ответы, которые я получил, похоже, достигают общего эффекта моего вопроса за счет переключения между несколькими стилями. Думаю, они косвенно ответят на мой вопрос. Ответ: функции «наследовать» не существует.

CarlJ 22.05.2024 03:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Исходя из моего понимания вашего вопроса, я бы сделал что-нибудь в этом направлении.

 <Style TargetType = "Label">
        <Setter Property = "TextColor" Value = "Black" />
        <Setter Property = "FontFamily" Value = "OpenSansRegular" />
        <Setter Property = "FontSize" Value = "14" />
    </Style>

    <Style x:Key = "SometimesOverrideColor" TargetType = "Label">
        <Setter Property = "TextColor" Value = "Pink" />
    </Style>

    <Style x:Key = "GreenLabelStyle" TargetType = "Label">
        <Setter Property = "TextColor" Value = "Green" />
    </Style>

А затем напишите короткий конвертер, который бы условно применял это:


//Name this sensibly 
public abstract class WhateverColorConveter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is not bool condition)
        {
            return null; // in case someone uses the converter but is a smartass
        }

        return  Application.Current.Resources.GetResource<Style>(condition ? "SometimesOverrideColor" : "GreenLabelStyle");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

GetResource — это расширение, которое я создал:

 public static T GetResource<T>(this ResourceDictionary dictionary, string key)
    {
        if (dictionary.TryGetValue(key, out var value) && value is T resource)
            return resource;
        else
            return default;
    }

И тогда это будет использоваться с вашим стилем кода XAML, не забудьте добавить это в свои ресурсы как статический ресурс:


<ContentPage.Resources>
    <converters:WhateverColorConveter x:Key = "WhateverColorConverter" />
</ContentPage.Resources>

И затем используйте это:

<Label Style = {Binding Condition, Converter = {StaticResource WhateverColorConverter}}/>

Я не знаю, насколько вы знакомы с поведением.

Если взять например CommunityToolkit.Maui и проверить ValidationBehavior.

У вас есть два стиля: ValidVisualState и InvalidVisualState.

Теперь это поведение вращается вокруг одного логического значения — IsValid. Это логическое значение изменяется в зависимости от разных подклассов. (Например, вы можете проверить текст с помощью регулярного выражения.)

В любом случае, что интересно, есть два метода: UpdateStyle и UpdateSate.

И тогда у вас есть

VisualStateManager.GoToState(view, isValid ? ValidVisualState : InvalidVisualState);

Знаете, это не обязательно должно быть логическое значение.

Вы можете задать поведение, используя Style1, Style2, Style3... И так далее. И затем одна связанная переменная, играющая роль «переключателя».

А поскольку это «стиль», вы можете изменять любые свойства, а не только цвет.

Проверьте эту ссылку: https://learn.microsoft.com/en-us/dotnet/communitytoolkit/maui/behaviors/

А если из коробки ничего не получается, можно «получить вдохновение» на создание собственного поведения. (Обратите внимание, что я не сказал «воровать». Воровать – это неправильно)

Другие вопросы по теме