none
Ajuda com binding RRS feed

  • Pergunta

  • Olá pessoal estou com dificuldades para usar o binding em um projeto que estou fazendo, pelo que eu pesquisei eu acho que é possivel mas não estou conseguindo.

    Bem vamos lá: o que eu gostaria de fazer é bindar um valor Color para uma propriedade BorderBrush de um Border. Eu fiz uma propriedade do tipo System.Drawing.Color com o seguinte valor "41; 191; 241" mas eu gostaria de mudar essa cor e salvar e ligar a um controle, porem eu não estou conseguindo.

    Se alguem puder me ajudar desde já agradeço.

    sábado, 25 de janeiro de 2014 21:17

Respostas

  • Eu andei pesquisando aqui, e encontrei na net a seguinte forma:

    xmlns:local="clr-namespace:Gerenciador">
    <Window.Resources>
            <local:ColorToBrushConverter  x:Key="ColorToBrushConverter"/>
    </Window.Resources>
        <Grid>
            <Border BorderBrush="{Binding Source={x:Static local:MySettings.Default}, Path=Efeito}" BorderThickness="5"/>
        </Grid>


    Herbert Lausmann

    quinta-feira, 30 de janeiro de 2014 13:59

Todas as Respostas

  • Você não pode bindar uma proprieadade do tipo Color para o tipo Brush (BorderBrush).

    É preciso criar uma propriedade do tipo SolidColorBrush para bindar com a propriedade BorderBrush.


    Herbert Lausmann

    domingo, 26 de janeiro de 2014 10:52
  • Pois é eu percebi isso, mas como que eu crio uma propriedade desse tipo e ligo ao controle.
    domingo, 26 de janeiro de 2014 11:11
  • Você quer declarar essa propriedade na Window que contem o Border?

    Herbert Lausmann

    domingo, 26 de janeiro de 2014 16:10
  • Se tivesse como criar em My.Settings esse tipo de propriedade e ligar a partir dai seria mais facil, porem eu não sei se isso é possivel. Eu acho melhor declarar na Window.

    Eu comecei fazendo uma Configuração do tipo System.Windows.Media.Color chamada "Efeito" em My.Settings que é para salva-la na proxima inicialização e criei uma Propriedade chamada "COR" na Window que vai ler e escrever My.Settings.Efeito. Na propriedade COR eu tenho que converter o valor Color para Brush, eu estou tentando da seguinte forma:

    Class MainWindow
        Implements INotifyPropertyChanged
        Dim _COR As Color
        Dim BRUSH As Brush
        Public Property COR() As Color
            Get
                Return _COR
            End Get
            Set(value As Color)
                _COR = value
                OnColorChanged("COR")
            End Set
        End Property
        Protected Overridable Sub OnColorChanged(ByVal PropertyName As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(PropertyName))
        End Sub
        Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    

    Eu sei que tenho que converter COR para BRUSH, eu estou meio confuso pois não sei se devo declarar a propriedade COR ou a propriedade BRUSH ou as duas.

    domingo, 26 de janeiro de 2014 22:29
  • Hum, se você tem uma propriedade do tipo System.Windows.Media.Color no My.Settings então não é preciso criar uma propriedade na Window. Você fará um binding direto para My.Settings.Efeito usando um Value Converter para converter o tipo Color para SolidColorBrush e vice-versa

    Adicione um arquivo de código vazio ao seu projeto e coloque o código abaixo nele:

    Public Class ColorToBrushConverter
    	Implements IValueConverter
    	Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
    		Return New SolidColorBrush(value)
    	End Function
    
    	Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
    		Return DirectCast(value, SolidColorBrush).Color
    	End Function
    End Class

    Exemplo de como fazer o Binding:

    <Window x:Class="MainWindow"
        xmlns:local="clr-namespace:NamespaceDoProjeto"
        xmlns:my="clr-namespace:My">
        <Window.Resources>
            <local:ColorToBrushConverter x:Key="ColorToBrushConverter" />
        </Window.Resources>
        <Grid>
            <Border BorderBrush="{Binding Source={x:Static my:Settings}, Path=Efeito, Converter={StaticResource ColorToBrushConverter}}"/>
        </Grid>
    </Window>


    Herbert Lausmann


    segunda-feira, 27 de janeiro de 2014 14:59
  • Herbert, tive alguns progressos, mas ainda tem alguns pontos que tem erro.

    Primeiro: da maneira como voce postou acima da o seguinte erro no xaml

    {Binding Path=Efeito,Converter={StaticResource ColorToBrushConverter},Source={x:Static my:Settings}}

    "Cannot find the member "Settings" on the target type.", eu consegui resolver  assim:

    {Binding Path=Efeito,Converter={StaticResource ColorToBrushConverter},Source={x:Static my:MySettingsProperty.Settings}}

    Desse modo no designer ele funciona perfeitamente, porem quando eu vou rodar da a seguinte mensagem de erro:'O valor fornecido em 'System.Windows.Markup.StaticExtension' iniciou uma exceção.' Número de linha '10' e posição de linha '86'. Esta é a linha e a coluna do xaml onde começa a ser aplicada a propriedade BorderBrush.

    <Border BorderThickness="1" Style="{StaticResource c-sombra}" Background="White" BorderBrush="{Binding Path=Efeito,Converter={StaticResource ColorToBrushConverter},Source={x:Static my:MySettingsProperty.Settings}}">

    segunda-feira, 27 de janeiro de 2014 22:17
  • Desculpe cara, errei na declaração do Name Scope. Faça assim, e deverá funcionar:

    xmlns:my="clr-namespace:Namespace_Do_Projeto.My"


    Herbert Lausmann

    terça-feira, 28 de janeiro de 2014 14:04
  • Olha eu só consigo assim:

    xmlns:local="clr-namespace:Gerenciador" 
    xmlns:my="clr-namespace:Gerenciador.My">
    <Window.Resources>
            <local:ColorToBrushConverter  x:Key="ColorToBrushConverter"/>
    </Window.Resources>
        <Grid>
            <Border BorderBrush="{Binding Source={x:Static my:MySettingsProperty.Settings}, Path=Efeito, Converter={StaticResource ColorToBrushConverter}}" BorderThickness="5"/>
        </Grid>

    No designer funciona beleza porem quando vou executar da a seguinte mensagem de erro:

    'O valor fornecido em 'System.Windows.Markup.StaticExtension' iniciou uma exceção.'

    Eu fiz um teste em um projeto em branco e tambem não funcionou.

    terça-feira, 28 de janeiro de 2014 14:25
  • Xaml é meio complexo, o jeito é ir tentando na base dos chutes.

    Pode ser que assim funcione:

    xmlns:local="clr-namespace:Gerenciador" 
    xmlns:my="clr-namespace:Gerenciador.My">
    <Window.Resources>
            <local:ColorToBrushConverter  x:Key="ColorToBrushConverter"/>
    </Window.Resources>
        <Grid>
            <Border BorderBrush="{Binding Source={x:Static my:MySettingsProperty}, Path=Settings.Efeito, Converter={StaticResource ColorToBrushConverter}}" BorderThickness="5"/>
        </Grid>


    Herbert Lausmann

    terça-feira, 28 de janeiro de 2014 15:07
  • Mais detalhes do erro:

    InnerException:"O valor de StaticExtension 'Gerenciador.My.MySettingsProperty.Settings' não pode ser resolvido como uma enumeração, campo estático ou propriedade estática."


    terça-feira, 28 de janeiro de 2014 22:53
  • Ok, tente essas duas formas e veja se alguma funciona:

    xmlns:local="clr-namespace:Gerenciador" 
    xmlns:my="clr-namespace:Gerenciador.My">
    <Window.Resources>
            <local:ColorToBrushConverter  x:Key="ColorToBrushConverter"/>
    </Window.Resources>
        <Grid>
            <Border BorderBrush="{Binding Source={x:Static my:MySettingsProperty}, Path=Settings.Efeito, Converter={StaticResource ColorToBrushConverter}}" BorderThickness="5"/>
        </Grid>
    xmlns:local="clr-namespace:Gerenciador" 
    xmlns:my="clr-namespace:Gerenciador.My">
    <Window.Resources>
            <local:ColorToBrushConverter  x:Key="ColorToBrushConverter"/>
    </Window.Resources>
        <Grid>
            <Border BorderBrush="{Binding Source={x:Static my:MySettingsProperty}, Path=Efeito, Converter={StaticResource ColorToBrushConverter}}" BorderThickness="5"/>
        </Grid>

    Herbert Lausmann

    quarta-feira, 29 de janeiro de 2014 10:26
  • Herbert eu tive analisando e consegui mudar a minha configuração "Efeito" do tipo System.Windows.Media.Color para System.Windows.Media.SolidColorBrush assim não necessita do conversor, agora como faço o binding?

    Eu tentei apenas remover a parte "Converter={StaticResource ColorToBrushConverter}" mas tambem não deu certo, detalhe: acessando a propriedade por codigo ela funciona perfeitamente.

    quarta-feira, 29 de janeiro de 2014 14:57
  • Eu andei pesquisando aqui, e encontrei na net a seguinte forma:

    xmlns:local="clr-namespace:Gerenciador">
    <Window.Resources>
            <local:ColorToBrushConverter  x:Key="ColorToBrushConverter"/>
    </Window.Resources>
        <Grid>
            <Border BorderBrush="{Binding Source={x:Static local:MySettings.Default}, Path=Efeito}" BorderThickness="5"/>
        </Grid>


    Herbert Lausmann

    quinta-feira, 30 de janeiro de 2014 13:59
  • É isso ai cara. Até que enfim, deu certinho.

    Muito obrigado Herbert!!!

    quinta-feira, 30 de janeiro de 2014 14:15