在WPF中,是否有方法绑定到兄弟属性?

在WPF中,是否有方法绑定到兄弟属性?,wpf,data-binding,xaml,Wpf,Data Binding,Xaml,我有一系列TextBlock和TextBox控件。是否有方法将样式应用于文本块s,以便它们可以立即数据绑定到控件 我希望能够做到这样: <Resources..> <Style x:Key="BindToFollowingTextBoxSibling"> <Setter Property="TextBlock.Text" Value="{Binding RelativeSource={RelativeSource FollowingSibli

我有一系列
TextBlock
TextBox
控件。是否有方法将
样式
应用于
文本块
s,以便它们可以立即数据绑定到控件

我希望能够做到这样:

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

... 更多属性和转换器。
...

这样做可能吗?

我认为在这种情况下最好的做法是按元素名称绑定:

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

这是文本框的1个文本
这是文本框的2个文本

它将实现类似的目标。这对您有用吗?

我知道这是一个旧线程,但我已经找到了解决此问题的方法。我能够使用 阿兰·李的建议,发现了。它不像CSS中那样通用,但如果您知道父元素类型,即使在样式中也能很好地工作

下面是我如何使用它的一个例子。我有一个文本框控件,当它有焦点时会亮起“高亮颜色”。此外,我希望它的相关标签控件在文本框有焦点时也亮起。因此,我为Label控件编写了一个触发器,使其以与TextBox控件类似的方式亮起。此触发器由名为IsFocusedByProxy的自定义附加属性触发。然后我需要将标签的IsFocusedByProxy绑定到文本框的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}}" />

现在,当我有一个充满这些事件的视图时,我可以这样做(我已经设置了隐式应用的必要样式,因此没有显示设置样式的标记):


这给了我这些结果

在任何文本框具有焦点之前:

使用不同的文本框接收焦点:


我可能会这么做。问题是,我正在研究绑定的几个属性和转换器,所以对每个属性都要进行大量的复制和转换。我想我可以通过ElementName绑定到TextBlock的标记,然后使用RelativeSource Self来获取我需要的属性。我最终只是创建了一个用户控件来处理我需要的情况。更简单。哈哈,酷酷的人,我的解决方案不是解决你问题的最佳方法,很高兴你解决了它=)+1 for
{Binding Path=Children[1]。IsFocused,RelativeSource={RelativeSource AncestorType=Grid}
。所以我假设Path=Children[1]中的“1”。。。指数是多少?这确实对我有用,但我想澄清数值的含义。@EdwardM正确,Path=Children[1]中的
1
是一个索引(当然是从零开始的索引)。如果你的结构不同,你可以调整这个数字。干杯
<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 ... -->