Em um aplicativo WPF, em um aplicativo MVP, tenho uma caixa de combinação, para a qual exibo os dados buscados no banco de dados. Antes dos itens adicionados à caixa Combo, quero exibir o texto padrão, como
" -- Selecionar time --"
de modo que ao carregar a página seja exibido e ao selecioná-lo, o texto deve ser apagado e os itens devem ser exibidos.
A seleção de dados do banco de dados está acontecendo. Preciso exibir o texto padrão até que o usuário selecione um item da caixa de combinação.
Por favor me guie
Focusable="False" IsEditable="True" IsReadOnly="True"
Você pode fazer isso sem qualquer código por trás, usando um
IValueConverter
.Aqui você tem a classe do conversor que pode ser reutilizada.
E, finalmente, você precisa declarar seu conversor em uma seção de recursos.
Onde Conversores é o local em que você colocou a classe de conversores. Um exemplo é:
O bom dessa abordagem é não haver repetição de código em seu código.
fonte
DataTrigger
para evitar até mesmo o código do conversor aqui :)Gosto da resposta do Tri Q, mas esses conversores de valor são difíceis de usar. PaulB fez isso com um manipulador de eventos, mas isso também é desnecessário. Esta é uma solução XAML pura:
fonte
Ninguém disse que uma solução xaml pura tem que ser complicada. Aqui está um simples, com 1 gatilho de dados na caixa de texto. Margem e posição conforme desejado
fonte
<Setter Property="Visibility" Value="Hidden"/>
fora do gatilho (dentro do estilo) e removerVisibility="Hidden"
do elemento de bloco de texto realDefina
IsEditable="True"
noComboBox
elemento. Isso exibirá aText
propriedade deComboBox
.fonte
Não sei se é compatível diretamente, mas você pode sobrepor o combo com um rótulo e defini-lo como oculto se a seleção não for nula.
por exemplo.
Então, na seleção mudou manipulador ...
fonte
Com base na resposta do IceForge, preparei uma solução reutilizável:
estilo xaml:
exemplo de uso:
fonte
Não tentei com caixas de combinação, mas isso funcionou para mim com outros controles ...
postagem de blog bloqueada por idade
Ele usa a camada de adorno aqui para exibir uma marca d'água.
fonte
A solução de HappyNomad foi muito boa e me ajudou a chegar a essa solução ligeiramente diferente.
fonte
A maneira mais fácil é usar CompositeCollection para mesclar texto e dados padrão do banco de dados diretamente no ComboBox, por exemplo
E em Resources, defina StaticResource para vincular as opções ComboBox ao seu DataContext, porque a vinculação direta em CollectionContainer não funciona corretamente.
Desta forma, você pode definir as opções do ComboBox apenas em xaml, por exemplo
fonte
Eu recomendaria o seguinte:
Defina um comportamento
Use o comportamento
fonte
A resposta do IceForge foi bem próxima e é AFAIK a solução mais fácil para esse problema. Mas faltou algo, pois não estava funcionando (pelo menos para mim, ele nunca realmente exibe o texto).
No final, você não pode simplesmente definir a propriedade "Visibility" do TextBlock como "Hidden" para que fique oculto quando o item selecionado da caixa de combinação não for nulo; você tem que DEFINIR dessa forma por padrão (uma vez que você não pode verificar não nulo em gatilhos , usando um Setter em XAML no mesmo lugar que os gatilhos.
Aqui está a solução real baseada na dele, o Setter ausente sendo colocado logo antes dos Ativadores:
fonte
EDIT: Por comentários abaixo, esta não é uma solução. Não tenho certeza de como estava funcionando e não posso verificar esse projeto.
É hora de atualizar esta resposta para o XAML mais recente.
Encontrando essa questão do SO em busca de uma solução para essa questão, descobri que a especificação XAML atualizada tem uma solução simples.
Um atributo chamado "Espaço reservado" agora está disponível para realizar essa tarefa. É tão simples quanto isto (no Visual Studio 2015):
fonte
PlaceholderText
propriedades naSystem.Windows.ComboBox
classe . Esta é uma pergunta sobre WPF, não WinForms.Não é a melhor prática ... mas funciona bem ...
Código por trás
fonte
Acredito que uma marca d'água conforme mencionada nesta postagem funcionaria bem neste caso
É necessário um pouco de código, mas você pode reutilizá-lo para qualquer combobox ou caixa de texto (e até mesmo caixas de senha), então eu prefiro assim
fonte
Estou usando uma classe IsNullConverter em meu projeto e funcionou para mim. aqui está o código para ele em c #, crie uma pasta chamada Converter e adicione esta classe nessa pasta, já que o gatilho usado não suporta valor para em vez de nulo, e IsNullConverter apenas faz isso
adicione o namespace no arquivo xaml assim.
significa
use esta linha abaixo dos recursos para torná-lo disponível através do código xaml
aqui está o código xaml, usei aqui o gatilho, então sempre que um item é selecionado na combobox a visibilidade do seu texto se torna falsa.
fonte
// Código XAML
// código ViewModel
fonte
Um pouco tarde mas ..
Uma maneira mais simples seria adicionar um item de dados fictício à lista com o parâmetro IsDummy = true e ter certeza de que não é HitTestVisable e sua altura é de 1 pixel (usando um conversor) para que não seja visto.
Do que apenas registrar em SelectionChanged e nele, definir o índice para o índice de item fictício.
Funciona muito bem e assim você não bagunça o estilo e as cores do ComboBox ou do tema do seu aplicativo.
fonte
O código acima demonstra a maneira mais simples de conseguir isso. Após o carregamento da janela, declare o texto da combobox, usando a propriedade .Text da combobox. Isso pode ser estendido ao DatePicker, Textbox e outros controles também.
fonte
Fiz isso antes de vincular o combobox aos dados do banco de dados no codebehind como este -
fonte
Coloque uma etiqueta no topo da combobox.
Vincule o conteúdo do rótulo à propriedade Texto da combobox.
Defina a opacidade do combobox para zero, Opacity = 0.
Escreva o texto padrão na propriedade Texto combobox
fonte
Defina apenas o atributo IsEditable como verdadeiro
fonte
Eu sei que isso é meio velho, mas e desta forma:
fonte
ComboBox
não temEmptySelectionBoxTemplate
propriedade.