Estou usando um BooleanToVisibilityConverter
no WPF para vincular a Visibility
propriedade de um controle a um Boolean
. Isso funciona bem, mas eu gostaria que um dos controles oculte se o booleano for true
e mostre se é false
.
.net
wpf
binding
visibility
Ruben Bartelink
fonte
fonte
Respostas:
Implemente sua própria implementação do IValueConverter. Uma implementação de amostra está em
http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx
No seu método Convert, ele retorna os valores que você deseja, em vez dos padrões.
fonte
Em vez de inverter, você pode atingir o mesmo objetivo usando uma
IValueConverter
implementação genérica que pode converter um valor booleano em valores de destino configuráveis para true e false. Abaixo está uma dessas implementações:Em seguida, subclasse-o onde
T
estáVisibility
:Por fim, é assim que você pode usar
BooleanToVisibilityConverter
acima no XAML e configurá-lo para, por exemplo, usarCollapsed
para verdadeiro eVisible
falso:Essa inversão é útil quando você deseja vincular a uma propriedade booleana chamada
IsHidden
opostaIsVisible
.fonte
Visibility
propriedades no seu modelo de visualização.e, em seguida, passe um verdadeiro ou falso como o ConverterParameter
fonte
else if (value is bool?)
parte, ReSharper me diz "Expressão é sempre falsa". Além disso, aif (flag)
peça pode ser reescrita de forma mais concisa comoreturn flag ? Visibility.Visible : Visibility.Collapsed;
.var nullable = (bool?)value; flag = nullable.GetValueOrDefault();
pode ser feito muito mais curto e simples:flag = (bool?)value ?? false;
Escreva o seu próprio é a melhor solução por enquanto. Aqui está um exemplo de um conversor que pode funcionar tanto de maneira normal quanto invertida. Se você tiver algum problema com isso, basta perguntar.
fonte
BooleanToVisibilityConverter
, verificando o parâmetro como null:Parameter direction = Parameter.Normal; if (parameter != null) direction = (Parameter)Enum.Parse(typeof(Parameter), (string)parameter);
Há também o projeto WPF Converters no Codeplex. Na documentação deles, eles dizem que você pode usar o MapConverter para converter da enumeração Visibility para bool
fonte
Mais uma maneira de vincular o valor booleano do ViewModel (IsButtonVisible) com a propriedade xaml Control Visibility. Sem codificação, sem conversão, apenas com estilo.
fonte
Ou o jeito preguiçoso, apenas use o que já existe e vire-o:
fonte
Se você não gosta de escrever um conversor personalizado, pode usar gatilhos de dados para resolver isso:
fonte
Acabei de fazer um post sobre isso. Eu usei uma idéia semelhante à de Michael Hohlios. Somente usei Propriedades em vez de usar o "parâmetro de objeto".
Vincular a visibilidade a um valor bool no WPF
Using Properties torna mais legível, na minha opinião.
fonte
Aqui está um que eu escrevi e uso muito. Ele usa um parâmetro conversor booleano que indica se deve ou não inverter o valor e, em seguida, usa XOR para executar a negação:
Aqui está uma tabela de verdade XOR para referência:
fonte
Eu estava procurando uma resposta mais geral, mas não consegui encontrá-la. Eu escrevi um conversor que pode ajudar outras pessoas.
É baseado no fato de que precisamos distinguir seis casos diferentes:
Aqui está minha implementação para os 4 primeiros casos:
exemplo:
Eu acho que os parâmetros são fáceis de lembrar.
Espero que ajude alguém.
fonte
Você pode usar o QuickConverter .
Com o QuickConverter, você pode escrever a lógica do conversor em linha com a sua BindingExpression
Aqui está um conversor BooleanToVisibility invertido:
Você pode adicionar o QuickConverter via NuGet. Dê uma olhada na documentação para instalação. Link: https://quickconverter.codeplex.com/
fonte
Escreva seu próprio convertido.
fonte
Uma versão simples de mão única que pode ser usada assim:
pode ser implementado assim:
fonte
Converta tudo em tudo (bool, string, enum, etc):
Exemplos XAML:
fonte
Em vez de escrever seu próprio código / reinventar, considere usar o CalcBinding :
O CalcBinding também é bastante útil para vários outros cenários.
fonte
Eu sei que isso é datado, mas você não precisa reimplementar nada.
O que fiz foi negar o valor da propriedade assim:
....
E funciona muito bem!
Estou esquecendo de algo?
fonte