Как использовать расширение метода в Maui xaml?

У меня есть объект Dto:

public class SearchResultDto
{
  public bool IsOne { get; set; };

  public bool IsTwo { get; set; }
}

И у меня есть расширение метода:

public static class SearchResultDtoExtension{
  public static bool IsBoth(this SearchResultDto dto)
  {
    return dto.IsOne && dto.IsTwo;
  }
}

В моей ViewModel я могу успешно использовать searchResultDto.IsBoth();

Я хочу, чтобы это расширение использовалось в xaml, например:

IsVisible = {Binding IsBoth()}

Это не работает.

Как я могу использовать расширение метода в xaml?

мой код:

<listView:SfListView.ItemTemplate>
    <DataTemplate x:DataType = "contracts:SearchResultDto">
            <VerticalStackLayout IsVisible = "{Binding **IsBoth()**}"

вы не можете привязывать методы в XAML, только общедоступные свойства

Jason 08.04.2024 15:31

Ну, только общедоступные свойства являются привязываемыми, а методы — нет. Вам нужно будет создать другое свойство, которое вызывает метод, например. авто-свойство. Общая рекомендация: лучше не использовать DTO непосредственно в качестве класса модели в MVVM. Вам следует создать отдельный класс для модели, а затем сопоставить DTO и модель. Таким образом, вы можете расширять и обновлять модель в соответствии с вашими потребностями, не меняя DTO.

Julian 08.04.2024 15:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
2
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Как объяснено в комментариях, вы не можете связывать методы в XAML, вместо этого вы можете использовать один из двух подходов:

  1. Используя ValueConverter:
public class IsBothConverter : IValueConverter
{
    public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
        => (value as SearchResultDto)?.IsBoth();


    public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
    <ContentPage.Resources>
        <ResourceDictionary>
            <local:IsBothConverter x:Key = "isBothConverter" />
        </ResourceDictionary>
    </ContentPage.Resources>
...

 <VerticalStackLayout IsVisible = "{Binding ., Converter = {StaticResource isBothConverter}}" />
  1. Использование свойства auto (например, @julian, предложенного в комментариях) Both внутри вашей ViewModel: Обратите внимание: всякий раз, когда изменяется свойство типа SearchResultDto, мы также вызываем событие изменения свойства для свойства Both.
SearchResultDto dto = new() { IsOne = true, IsTwo = true };

public SearchResultDto Dto
{
    get => dto;
    set
    {
        dto = value;
        OnPropertyChanged(nameof(Dto));
        OnPropertyChanged(nameof(Both));
    }
}

public bool Both => (dto is null) ? false : dto.IsOne && dto.IsTwo;

Я вижу, что вы находитесь внутри datatemplate, поэтому вам необходимо убедиться в правильности Source и x:DataType при привязке к Both:

 <VerticalStackLayout IsVisible = "{Binding Path = "Both", Source = "..."}" />
  1. Использование третьего автоматического свойства внутри вашей модели (это противоречит шаблону mvvm, поскольку модель и представление не разделены должным образом)
public class SearchResultDto
{
    public bool IsOne { get; set; }
    public bool IsTwo { get; set; }
    public bool IsBoth => IsOne && IsTwo;
}
 <VerticalStackLayout IsVisible = "{Binding IsBoth}" />

Просто предложение: возможно, также включите способ сделать это без прямого использования DTO в представлении.

Julian 08.04.2024 16:22

@Джулиан, ты имеешь в виду без изменения класса SearchResultDto, добавив IsBoth ?

Cfun 08.04.2024 16:23

Да, потому что автоматические свойства обычно не являются частью DTO, поскольку идея наличия DTO на самом деле представляет собой просто передачу данных, и, как правило, DTO может меняться со временем. Например, у DTO уже может быть флаг или что-то под названием IsBoth, но с совершенно другим значением. В любом случае, просто предложение.

Julian 08.04.2024 16:27

@Джулиан полностью согласен, лучше всего следовать шаблону mvvm

Cfun 08.04.2024 16:42

Я думал о специальном классе модели, например. SearchResult, но это тоже работает.

Julian 08.04.2024 16:56

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