代码之家  ›  专栏  ›  技术社区  ›  Salman A

在WPF中,是否有方法绑定到同级属性?

  •  20
  • Salman A  · 技术社区  · 15 年前

    我有一系列 TextBlock TextBox 控制。有没有办法申请 Style 控件 这样,它们就可以在控件之后立即进行数据绑定吗?

    我想做点类似的事情:

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

    这样的事情是可能的吗?

    2 回复  |  直到 11 年前
        1
  •  17
  •   Carlo    15 年前

    我认为在这种情况下最好的做法是用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>
    

    它将达到类似的效果。这对你有用吗?

        2
  •  23
  •   Jason Frank    11 年前

    我知道这是一条旧线,但我 找到了这个问题的解决方案 . 我可以使用 阿兰·李的建议,发现 here . 它不像在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}}" />
    

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

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

    这给了我这些结果 :

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

    Before any TextBoxes have focus

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

    after focus 1

    after focus 2