AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78600052
Accepted
M.M
M.M
Asked: 2024-06-10 08:10:01 +0800 CST2024-06-10 08:10:01 +0800 CST 2024-06-10 08:10:01 +0800 CST

Como iterar sobre um número desconhecido de componentes em uma página no Blazor

  • 772

Minha página Blazor (.NET 8) possui uma lista de componentes gerados, um para cada linha em uma resposta de consulta de banco de dados:

@foreach (var item in _listOfItems)
{
    <CollapsibleCard Title="item.CardTitle">
        other contest based on item..
    </CollapsibleCard>
}

onde CollapsibleCardestá um componente que fiz que envolve Bootstrap card, adicionando um botão recolher/expandir, e o estado recolhido/expandido é gerenciado usando o código Blazor (ou seja, não no nível Javascript).

Gostaria de ter um botão na página que recolhesse ou expandisse todos os cartões de uma vez. O componente possui um método para recolhê-lo ou expandi-lo. Qual código posso colocar no onclickmanipulador para que o botão passe por todos esses cartões?

Para um número fixo de cartões, eu poderia usar @refa definição de cada um, mas não tenho certeza de como isso funcionaria neste cenário em que poderia haver qualquer número de componentes.

Nota. Eu já tentei ter um parâmetro para o estado expandido/recolhido, mas geralmente descobri que essa abordagem não funciona: o compilador emite avisos se você tentar modificar o valor de um parâmetro de dentro do componente (como aconteceria quando o usuário clica em o botão no cartão para expandi-lo), e alterar o valor do parâmetro de fora do componente não faz nada, pois o componente não sabe como se renderizar novamente, você teria que iterar sobre os componentes para re- renderize-os de qualquer maneira ou renderize novamente a página inteira.

c#
  • 1 1 respostas
  • 34 Views

1 respostas

  • Voted
  1. Best Answer
    MrC aka Shaun Curtis
    2024-06-10T16:25:44+08:002024-06-10T16:25:44+08:00

    Você precisa usar um objeto de estado em cascata com um evento. Usar @refnão é o caminho a percorrer. Este é um padrão de notificação comum usado no Blazor. Se você pesquisar no SO por "Blazor Notification Pattern" encontrará diversas respostas sobre o assunto.

    Você pode colocar em cascata o objeto de estado para um contexto de nível de formulário ou registrá-lo como um serviço com escopo definido para um contexto de nível de sessão SPA .

    Aqui está uma demonstração rápida e suja.

    public class CardState
    {
        public bool AllOpen { get; private set; }
        public event EventHandler<bool>? StateChanged;
    
        public void CloseAllCards()
        {
            AllOpen = false;
            this.StateChanged?.Invoke(this, this.AllOpen);
        }
    
        public void OpenAllCards()
        {
            AllOpen = true;
            this.StateChanged?.Invoke(this, this.AllOpen);
        }
    }
    

    Um cartão muito simples

    @implements IDisposable
    
    @if (_isOpen)
    {
        <div class="card my-2">
            <div class="m-2 text-end">
                <button class="btn btn-dark" @onclick="this.Close">Close</button>
            </div>
            <div class="card-body">Basic card</div>
        </div>
    }
    @code {
        [CascadingParameter] private CardState? CardState { get; set; }
        [Parameter] public bool IsInitiallyOpen { get; set; } = true;
        private bool _isOpen = true;
    
        protected override void OnInitialized()
        {
            _isOpen = this.IsInitiallyOpen;
            if (this.CardState is not null)
                this.CardState.StateChanged += this.OnStateChanged;
        }
    
        protected void Close()
        {
            _isOpen = false;
        }
    
        private void OnStateChanged(object? sender, bool state)
        {
            _isOpen = state;
            // must call here as this is not a UI event
            this.StateHasChanged();
        }
    
        public void Dispose()
        {
            if (this.CardState is not null)
                this.CardState.StateChanged -= this.OnStateChanged;
        }
    
    }
    

    E página de demonstração

    @page "/"
    
    <PageTitle>Home</PageTitle>
    
    <h1>Hello, world!</h1>
    
    <div class="m-2 p-2 text-end">
        <button class="btn btn-primary" @onclick="ChangeState">Change</button>
    </div>
    
    <CascadingValue Value="_cardState">
        <Card />
        <Card />
        <Card />
        <Card />
    </CascadingValue>
    
    @code {
        private readonly CardState _cardState = new();
    
        private void ChangeState()
        {
            if (_cardState.AllOpen)
                _cardState.CloseAllCards();
    
            else
                _cardState.OpenAllCards();
        }
    }
    
    • 2

relate perguntas

  • Polly DecorrelatedJitterBackoffV2 - como calcular o tempo máximo necessário para concluir todas as novas tentativas?

  • Wpf. Role o DataGrid dentro do ScrollViewer

  • A pontuação que ganhei na página do jogo com .NET MAUI MVVM não é visível em outras páginas. Como posso manter os dados de pontuação no dispositivo local

  • Use a hierarquia TreeView com HierarchicalDataTemplate de dentro de um DataTemplate

  • Como posso melhorar essa interface de validação no .NET?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve