Usuário com melhor resposta
Ajuda com binding

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.
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
- Marcado como Resposta Franklin Bitencourt quinta-feira, 30 de janeiro de 2014 14:15
Todas as Respostas
-
-
-
-
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.
-
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
- Editado Herbert Lausmann segunda-feira, 27 de janeiro de 2014 15:01
-
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}}">
-
-
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.
-
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
-
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."
- Editado Franklin Bitencourt terça-feira, 28 de janeiro de 2014 22:54
-
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
-
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.
-
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
- Marcado como Resposta Franklin Bitencourt quinta-feira, 30 de janeiro de 2014 14:15
-