WPF GroupBox HeaderTemplate和DataBinding

时间:2010-03-11 13:09:26

标签: wpf groupbox

我将一个headertemplate定义为一个wpf组框,并且数据绑定不起作用。我不明白为什么。

<GroupBox>
<GroupBox.HeaderTemplate>
            <DataTemplate>
            <StackPanel Orientation="Horizontal" >
                <Image Source="/PopuAssuNetApplication.UI.Control;component/Images/Members.png" Width="24" />
                <TextBlock VerticalAlignment="Center">
                                <TextBlock.Text>
                                        <MultiBinding StringFormat="{x:Static Member=resx:Resources.PersonsInContractGroupBox}"> 
                                            <Binding Path="CurrentContract.Federation" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}">
                                            </Binding>
                                            <Binding Path="CurrentContract.Type" Converter="{StaticResource contractTypeConverter}" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}">
                                            </Binding>
                                            <Binding Path="CurrentContract.Number" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}">
                                            </Binding>
                                        </MultiBinding>
                                    </TextBlock.Text>
                </TextBlock>
                <WpfComponent:WaitControl Margin="7,0,0,0" VerticalAlignment="Top" Width="24" Height="24" MarginCenter="4">
                    <WpfComponent:WaitControl.Style>
                        <Style>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Path=IsMembersOfContractBusy, UpdateSourceTrigger=PropertyChanged, ElementName=PersonsInContract}" Value="true">
                                    <Setter Property="WpfComponent:WaitControl.Visibility" Value="Visible" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding Path=IsMembersOfContractBusy, UpdateSourceTrigger=PropertyChanged, ElementName=PersonsInContract}" Value="false">
                                    <Setter Property="WpfComponent:WaitControl.Visibility" Value="Collapsed" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </WpfComponent:WaitControl.Style>
                </WpfComponent:WaitControl>
            </StackPanel>
                </DataTemplate>
        </GroupBox.HeaderTemplate>

5 个答案:

答案 0 :(得分:22)

问题在于HeaderTemplate用于模板标题,因此HeaderTemplate DataContext Header是您绑定的任何内容或分配给GroupBox属性Header {1}}。

DataContext属性视为控件标题的DataContext。通常,Header属性会从其父级中获取其值,但由于并非每个控件都有Header="{Binding}",因此除非您设置了标题,否则标题为空。

通过将Header显式绑定到当前的DataContext Header,您的示例应该按预期工作。为了帮助说明这是如何工作的,我在下面创建了一个简单的示例,其中显示了DataContext<GroupBox Header="HEADER TEXT" DataContext="BODY TEXT"> <GroupBox.HeaderTemplate> <DataTemplate> <Button Content="{Binding}" Background="LightGreen" /> </DataTemplate> </GroupBox.HeaderTemplate> <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" Content="{Binding}" /> </GroupBox> 如何相互独立地工作,以便向控件的正文或标题提供数据。

GroupBox

这将产生一个databinding,如下所示。

GroupBox with templated header

  

我认为默认情况下DataContext,wpf始终从datatemplate属性获取数据。似乎不在DataContext

您对DataTemplate的假设是正确的,并且它在{{1}}中有效,因为我已经证明了它只是在Header模板中DataContext是来自Header属性的值而不是DataContext本身

答案 1 :(得分:3)

    <GroupBox >
        <GroupBox.HeaderTemplate>
            <DataTemplate>
                    <RadioButton Content="myR"
                            IsChecked="{Binding rIsChecked, Mode=TwoWay}"
                            DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}}" />
            </DataTemplate>
        </GroupBox.HeaderTemplate>
        <GroupBox.Content>
            <Grid IsEnabled="{Binding rIsChecked}">
            </Grid>
        </GroupBox.Content>
    </GroupBox>

只需将GroupBox DC传播到DataTemplate内容......就像魅​​力......

答案 2 :(得分:2)

GroupBox没有名为“CurrentContract”的成员。最有可能的是,您想从相应的ViewModel访问名为“CurrentContract”的属性?! ViewModel是GroupBox的DataContext,因此您必须将绑定路径更改为类似...

<Binding Path="DataContext.CurrentContract.Type" Converter="{StaticResource contractTypeConverter}" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}">

答案 3 :(得分:1)

上面学到的经验对于DataTemplates一般很有用,但我最近发现有一种更好的方法来更改组合框的标题:

<GroupBox>
    <GroupBox.Header>
        <CheckBox IsChecked="{Binding Path=mSomeBoolean}"/>
    </GroupBox.Header>
</GroupBox>

这样就不需要在绑定中定义相对源。

另请注意this issue与GroupBoxes和标题。

答案 4 :(得分:0)

这对我有用:

<HeaderedContentControl Header="{Binding}" Style="{StaticResource TallHeaderedContentStyle}">
  <HeaderedContentControl.HeaderTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Path=HeaderText"} />
    </DataTemplate>
  </HeaderedContentControl.HeaderTemplate>
相关问题