none
Possuir o inverso da propriedade já existente RRS feed

  • Pergunta

  • Possuo duas caixas na tela. Só uma delas pode aparecer de cada vez, então quando o usuário marca uma propriedade como true aparece uma caixa, se ele desmarca tem que aparecer outra.
    Fiz um converter de booleano para visibilty e a primeira caixa ficou certo. Quando marca, a primeira caixa aparece. Agora eu queria fazer o inverso disso. O problema de criar um Propriedade1Marcada e Propriedade1Desmarcada é que preciso ficar disparando os dois propertychanged para notificar o XAML da alteração. Não existe um jeito mais prático de fazer isso?
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    terça-feira, 2 de fevereiro de 2010 11:33

Respostas

  • Crie um converter que faz o inverso - se for True, volta a visibilidade Collapsed e use a mesma propriedade nas duas caixas, cada um com o seu converter.

    Bruno
    MVP Client Development - http://msmvps.com/blogs/bsonnino
    terça-feira, 2 de fevereiro de 2010 11:59
  • Bruno, na verdade essa foi a primeira resposta que me veio em mente mas:
    O conversor é algo meio padrão para várias telas. Estou criando eles em um projeto tipo Core que guarda diversas coisas diferentes, inclusive os conversores que podem ser utilizados em qualquer lugar.
    Quando eu falo que tenho um conversor de bool para visibility, ter um outro conversor implicaria em um pouco de confusão na nomenclatura, certo? InverseVisibilitToBooleanConverter? Estranho.

    Eu fiquei pensando um pouco e lembrei em outro tópico meu você ensinou sobre o CommandParameter. Então eu juntei o útil com agradável e ficou assim:

    No método de Conversão dentro do Converter eu pego e verifico:
    //verifico primeiro o parâmetro
    if (parameter != null && parameter.ToString().Equals("false"))
    {//se o parâmetro !NÃO é nulo (foi passado algum valor) e o parâmetro é FALSO (valor booleano false)
    	parameter = (bool)value == false;//ele inverte o valor
    
    }
    else
    {//se o parâmetro é NULL ou se o parâmetro não é falso
    	parameter = (bool)value == true;//mantenho o valor passado
    
    }
    //verifico se o valor é true
    if ((bool)parameter)
    {//se for
    	return Visibility.Visible;//retorno visível
    }
    else 
    {//se não for
    	return Visibility.Collapsed;//retorno collapsed
    }
    Desse jeito, bastou utilizar o Converter normal (sem parâmetro) quando vou usar normalmente ou passar um CommandParameter = false quando quero inverter o valor da propriedade!

    Não sei se é muito recomendado isso, mas achei inteligente e produtivo!

    mesmo assim, obrigado pela ajuda
    ;)



    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    terça-feira, 2 de fevereiro de 2010 13:40

Todas as Respostas

  • Crie um converter que faz o inverso - se for True, volta a visibilidade Collapsed e use a mesma propriedade nas duas caixas, cada um com o seu converter.

    Bruno
    MVP Client Development - http://msmvps.com/blogs/bsonnino
    terça-feira, 2 de fevereiro de 2010 11:59
  • Bruno, na verdade essa foi a primeira resposta que me veio em mente mas:
    O conversor é algo meio padrão para várias telas. Estou criando eles em um projeto tipo Core que guarda diversas coisas diferentes, inclusive os conversores que podem ser utilizados em qualquer lugar.
    Quando eu falo que tenho um conversor de bool para visibility, ter um outro conversor implicaria em um pouco de confusão na nomenclatura, certo? InverseVisibilitToBooleanConverter? Estranho.

    Eu fiquei pensando um pouco e lembrei em outro tópico meu você ensinou sobre o CommandParameter. Então eu juntei o útil com agradável e ficou assim:

    No método de Conversão dentro do Converter eu pego e verifico:
    //verifico primeiro o parâmetro
    if (parameter != null && parameter.ToString().Equals("false"))
    {//se o parâmetro !NÃO é nulo (foi passado algum valor) e o parâmetro é FALSO (valor booleano false)
    	parameter = (bool)value == false;//ele inverte o valor
    
    }
    else
    {//se o parâmetro é NULL ou se o parâmetro não é falso
    	parameter = (bool)value == true;//mantenho o valor passado
    
    }
    //verifico se o valor é true
    if ((bool)parameter)
    {//se for
    	return Visibility.Visible;//retorno visível
    }
    else 
    {//se não for
    	return Visibility.Collapsed;//retorno collapsed
    }
    Desse jeito, bastou utilizar o Converter normal (sem parâmetro) quando vou usar normalmente ou passar um CommandParameter = false quando quero inverter o valor da propriedade!

    Não sei se é muito recomendado isso, mas achei inteligente e produtivo!

    mesmo assim, obrigado pela ajuda
    ;)



    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    terça-feira, 2 de fevereiro de 2010 13:40