Tengo una serie de TextBlock y TextBox controles. Es allí una manera de aplicar un Style a la TextBlocks tales que puedan databind para el control inmediatamente después de ellos?

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?

InformationsquelleAutor Eclipse | 2009-05-15

2 Comentarios

  1. 17

    Creo que la mejor cosa a 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>

    Va a lograr algo similar. Hace este trabajo para usted?

    • Eso es algo de lo que estoy probable que va a hacer. El problema es que hay varias propiedades y convertidores que estoy buscando en la unión, para que llegue a ser un montón de copiar y pegar para hacer esto para cada propiedad. Estoy pensando que podría unirse por ElementName para el Bloque de la Etiqueta y, a continuación, utilizar RelativeSource Auto para obtener las propiedades que necesito.
    • Hice este trabajo para usted?
    • Acabé de crear un control de usuario que maneja los casos que yo necesitaba. Era mucho más fácil.
    • Jaja genial hombre, mi solución no era un método óptimo para su problema, me alegra que haya solucionado =)
  2. 24

    Sé que este es un hilo viejo, pero he encontrado una solución a este problema. Yo era capaz de utilizar
    Aland Li sugerencia, encontró aquí. Su no es tan genérico como es en CSS, pero si usted sabe que el padre del tipo de elemento, esto funciona muy bien incluso en un Estilo de.

    He aquí un ejemplo de cómo la he usado. Tengo un control de cuadro de texto que se ilumina con un «color de resaltado» cuando tiene el foco. Además, yo quería que sus asociados de la Etiqueta de control también se enciende cuando el cuadro de texto tenía el foco. Así que escribí un Disparador para el control de Etiqueta que hizo la luz en una manera similar que el control TextBox hizo. Este Disparador se activa por una costumbre de la propiedad asociada llamado IsFocusedByProxy. Entonces yo necesitaba para enlazar la Etiqueta de la IsFocusedByProxy en el cuadro de texto del IsFocused. 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, usted puede estar pensando que no es mejor que el de usar sólo ElementName en la Unión. Pero la diferencia es que ahora puedo mover esta unión en un Estilo para la reutilización:

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

    Y ahora puedo cuando tengo una Vista completa de estas apariciones, como este (tengo el programa de instalación de la necesaria Estilos para ser aplicado de forma implícita, así que por eso no hay ningún marcado 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 ... -->

    Que me da estos resultados:

    Antes de cualquier cuadros de texto tiene el foco:

    En WPF, es allí una manera de obligar a un hermano propiedades?

    Con diferentes cuadros de texto enfoque de recepción:

    En WPF, es allí una manera de obligar a un hermano propiedades?

    En WPF, es allí una manera de obligar a un hermano propiedades?

    • +1 para {Binding Path=Children[1].IsFocused, RelativeSource={RelativeSource AncestorType=Grid}}.
    • Así que asumo que el «1» en el Path=Niños[1]… es el índice? Esto funcionó para mí, pero quería aclarar el significado del valor.
    • Correcto, el 1 en Path=Children[1] es un índice (índice basado en cero de curso). Así que usted puede ajustar este número si su estructura era diferente. Saludos.

Dejar respuesta

Please enter your comment!
Please enter your name here