In WPF, c’è un modo per associare a un fratello proprietà?

Ho una serie di TextBlock e TextBox controlli. C’è un modo per applicare un Style per il TextBlocks tale che essi possono databind a controllo immediatamente dopo di loro?

Mi piacerebbe essere in grado di fare qualcosa di simile a questo:

<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}"/>

È qualcosa di simile a questo è anche possibile?

InformationsquelleAutor Eclipse | 2009-05-15

 

2 Replies
  1. 17

    Penso che la cosa migliore da fare in questo caso è legato da 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>

    Verrà ottenere qualcosa di simile. Fa questo lavoro per voi?

    • Questo è il tipo di cosa sto probabilmente andando a fare. Il problema è che ci sono diverse proprietà e convertitori che sto guardando vincolante, in modo che si ottiene un sacco di copia e passato a fare questo per ogni proprietà. Sto pensando che potrei associare da ElementName per il TextBlock Tag e quindi utilizzare RelativeSource Auto per ottenere le proprietà di cui ho bisogno.
    • Fatto questo sempre lavoro per voi?
    • Ho finito solo la creazione di un utente-controllo che ha gestito i casi di cui avevo bisogno. Era solo più facile.
    • Haha cool man, la mia soluzione non era un approccio ottimale al problema, contento che hai risolto =)
  2. 24

    So che questo è un vecchio thread, ma ho trovato una soluzione a questo problema. Sono stato in grado di utilizzare
    Aland Li suggerimento, trovato qui. La sua non è abbastanza generico come è nel CSS, ma se si conosce il genitore di un tipo di elemento, questo funziona bene anche in uno Stile.

    Ecco un esempio di come l’ho usato. Ho una casella di controllo che si accende con un “colore di evidenziazione” quando è attivo. Inoltre, ho voluto la sua Etichetta associata di controllo per in luce anche quando la casella di testo attivo. Così ho scritto un Trigger per il controllo Label che ha reso la luce in un modo simile a quello che il controllo TextBox fatto. Questo Trigger viene attivato da una proprietà associata personalizzata chiamato IsFocusedByProxy. Quindi ho bisogno di associare il marchio IsFocusedByProxy per la TextBox IsFocused. Così ho usato questa tecnica:

    <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>

    A questo punto si può pensare che la sua non è migliore di quella che solo utilizzando ElementName nell’Associazione. Ma la differenza è che ora posso spostare questa associazione in uno Stile per il riutilizzo:

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

    E ora posso quando l’ho Vista piena di queste occorrenze, come questo (ho impostato il necessario Stili per essere applicato in modo implicito, in modo che è perché non c’è nessun codice mostrato che imposta gli Stili):

    <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 ... -->

    Che mi dà questi risultati:

    Prima di qualsiasi Caselle di testo sono di messa a fuoco:

    In WPF, c'è un modo per associare a un fratello proprietà?

    Con diverse Caselle di testo ricezione di messa a fuoco:

    In WPF, c'è un modo per associare a un fratello proprietà?

    In WPF, c'è un modo per associare a un fratello proprietà?

    • +1 per {Binding Path=Children[1].IsFocused, RelativeSource={RelativeSource AncestorType=Grid}}.
    • Quindi io parto dal presupposto “1” nel Path=Bambini[1]… è l’indice? Questo ha funzionato per me, ma volevo chiarire il significato del valore del numero.
    • Corretto, il 1 in Path=Children[1] è un indice (indice a base zero, naturalmente). In modo da poter regolare il numero se la vostra struttura è stata diversa. Ciao.

Lascia un commento