2009-05-15 44 views
15

私は一連のTextBlockTextBoxのコントロールを持っています。 TextBlockStyleを適用して、すぐ後にコントロールにデータバインドできるようにする方法はありますか?WPFでは、兄弟プロパティにバインドする方法はありますか?

私はこのような何かをできるようにしたいと思います:

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

でも可能、このようなものですか?

答えて

14

私はこのケースで行うための最善のことはの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> 

それは似たような達成します。これはあなたのために働きますか?

+0

私はそうするつもりです何のようなものだ:フォーカスを受け取る異なるのTextBoxで

Before any TextBoxes have focus

:ボックスがフォーカスを持っています。問題は、私がバインディングを見ているいくつかのプロパティとコンバーターがあることです。そのため、すべてのプロパティに対してこれを行うために多くのコピーと過去になることになります。 ElementNameによってTextBlockのタグにバインドし、RelativeSource Selfを使用して必要なプロパティを取得すると考えています。 – Eclipse

+0

これはあなたのためにこれまで働きましたか? – Carlo

+0

私は、必要なケースを処理するユーザコントロールを作成しました。それだけで簡単だった。 – Eclipse

19

私はこれが古いスレッドだと知っていますが、はこの問題の解決策を見つけました。私は アランドリの提案を使用することができた、hereを見つけた。 CSSと同じくらい一般的ではありませんが、親要素タイプを知っていれば、のスタイルでもでもうまく動作します。

ここでは、その使い方の例を示します。フォーカスがあるときに "ハイライトカラー"で点灯するTextBoxコントロールがあります。さらに、TextBoxにフォーカスがあったときに、関連するLabelコントロールも点灯するようにしました。だから、私はTextBoxコントロールと同様の方法でそれを点灯させるLabelコントロールのTriggerを書きました。このトリガーは、IsFocusedByProxyという名前のカスタム添付プロパティによってトリガーされます。次に、LabelのIsFocusedByProxyをTextBoxのIsFocusedにバインドする必要がありました。だから、私はこのテクニックを使用しました:

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

この時点では、バインディングでElementNameを使用するよりもそれほど優れているとは思わないかもしれません。 しかし、違い、今、私は再利用のためのスタイルにこの結合を動かすことができるということです。

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

そして、私はこのように、これらのoccurances、の完全なビューを持っている場合、今、私は(私は必要なスタイルに設定を持つことができますスタイルを設定示し一切のマークアップはありません理由ですので)、暗黙的に適用される:

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

私にこれらの結果与える:任意のテキストの前に

after focus 1

after focus 2

+6

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

+0

私はPath = Children [1]で "1"と仮定しています...インデックスですか?これは私のために働いたが、数値の意味を明確にしたかった。 – EdwardM

+1

@EdwardM正しいですが、 'Path = Children [1]'の '1'はインデックス(もちろんゼロベースのインデックス)です。構造が異なる場合は、その数を調整することができます。乾杯。 –