2009-05-15 18 views
15

Tengo una serie de controles TextBlock y TextBox. ¿Hay alguna manera de aplicar un Style al TextBlock s de modo que puedan enlazar datos con el control inmediatamente después de ellos?En WPF, ¿hay alguna forma de vincular las propiedades de los hermanos?

Me gustaría ser capaz de hacer algo como esto:

<Resources..> 
    <Style x:Key="BindToFollowingTextBoxSibling"> 
     <Setter Property="TextBlock.Text" Value="{Binding RelativeSource={RelativeSource FollowingSibling}, Path=Text, Converter={StaticResource MyConverter}}" /> 
     <Setter Property="TextBlock.Background" Value="{Binding RelativeSource={RelativeSource FollowingSibling}, Path=Text, Converter={StaticResource TextToBrushConverter}}" /> 
     ... More properties and converters. 
    </Style> 
</Resources> 

... 

<TextBlock Style="{StaticResource BindToFollowingTextBoxSibling}"/> 
<TextBox/> 

<TextBlock Style="{StaticResource BindToFollowingTextBoxSibling}"/> 
<TextBox/> 
<TextBlock Style="{StaticResource BindToPreviousTextBoxSibling}"/> 

es algo como esto posible, incluso?

Respuesta

14

creo que lo mejor que puede hacer en este caso se unen por ElementName:

<TextBlock Text="{Binding ElementName=textBox1, Path=Text}" /> 
<TextBox x:Name="textBox1">this is the textBox's 1 text</TextBox> 
<TextBlock Text="{Binding ElementName=textBox2, Path=Text}" /> 
<TextBox x:Name="textBox2">this is the textBox's 2 text</TextBox> 

se va a lograr algo similar. ¿Esto funciona para tí?

+0

Eso es algo de lo que estoy probable que va a hacer. El problema es que hay varias propiedades y conversores que estoy buscando vinculantes, por lo que se necesita mucha copia y más para hacer esto para cada propiedad. Estoy pensando en vincular por ElementName a la Etiqueta de Bloqueo de Texto y luego usar RelativeSource Self para obtener las propiedades que necesito. – Eclipse

+0

¿Esto alguna vez funcionó para ti? – Carlo

+0

Terminé creando un control de usuario que manejaba los casos que necesitaba. Fue simplemente más fácil. – Eclipse

19

Sé que este es un hilo antiguo, pero he encontrado y he encontrado una solución a este problema. Pude usar la sugerencia de Aland Li, encontré here. No es tan genérico como en CSS, pero si conoces el tipo de elemento principal, esto funciona muy bien incluso en un estilo.

Aquí hay un ejemplo de cómo lo usé. Tengo un control TextBox que se ilumina con un "color de resaltado" cuando tiene foco. Además, quería que su control Label asociado también se iluminara cuando el TextBox tenía foco. Así que escribí un disparador para el control Label que lo iluminaba de manera similar a como lo hacía el control TextBox. Este desencadenador se desencadena por una propiedad adjunta personalizada llamada IsFocusedByProxy. Entonces necesité unir el IsFocusedByProxy de la Etiqueta al IsFocused del TextBox. Así que he usado esta técnica:

<Grid x:Name="MaxGrid"> 
    <Label x:Name="MaxLabel" 
      Content="Max:" 
      c5:TagHelper.IsFocusedByProxy="{Binding 
            Path=Children[1].IsFocused, 
            RelativeSource={RelativeSource AncestorType=Grid}}" 
     /> 
    <c5:TextBoxC5Mediator x:Name="MaxTextBox"       
          DataContext="{Binding ConfigVm.Max_mediator}" /> 
</Grid> 

En este punto se puede pensar que no es mejor que el uso de sólo ElementName en la unión. Pero la diferencia es que ahora puedo mover esta unión en un estilo de reutilización:

<Setter Property="C5_Behaviors:TagHelper.IsFocusedByProxy" 
     Value="{Binding Path=Children[1].IsFocused, 
        RelativeSource={RelativeSource AncestorType=Grid}}" /> 

Y ahora puedo cuando tiene una vista completa de estas ocurrencias, como esto (he fijado los estilos necesarios para se aplicará de forma implícita, así que por eso no hay margen de beneficio demostrado que establece los estilos):

<Grid x:Name="MaxGrid"> 
    <Label x:Name="MaxLabel" 
      Content="Max:" /> 
    <c5:TextBoxC5Mediator x:Name="MaxTextBox"       
          DataContext="{Binding ConfigVm.Max_mediator}" /> 
</Grid> 
<Grid x:Name="MinGrid"> 
    <Label x:Name="MinLabel" 
      Content="Min:" /> 
    <c5:TextBoxC5Mediator x:Name="MinTextBox"       
          DataContext="{Binding ConfigVm.Min_mediator}" /> 
</Grid> 
<Grid x:Name="StepFactorGrid"> 
    <Label x:Name="StepFactorLabel" 
      Content="Step Factor:" /> 
    <c5:TextBoxC5Mediator x:Name="StepFactorTextBox"       
          DataContext="{Binding ConfigVm.StepFactor_mediator}" /> 
</Grid> 
<!-- ... and lots more ... --> 

Lo que me da estos resultados:

Antes de cualquier texto Las cajas han de enfoque:

Before any TextBoxes have focus

con diferentes cuadros de texto que recibe el foco:

after focus 1

after focus 2

+6

+1 para '{Binding Path = Children [1] .IsFocused, RelativeSource = {RelativeSource AncestorType = Grid}}'. –

+0

Entonces, estoy asumiendo que el "1" en Path = Children [1] ... es el índice? Esto funcionó para mí, pero quería aclarar el significado del valor numérico. – EdwardM

+1

@EdwardM Correcto, el '1' en' Ruta = Niños [1] 'es un índice (índice de curso basado en cero). Entonces puedes ajustar ese número si tu estructura es diferente. Aclamaciones. –

Cuestiones relacionadas