WPF GroupBox HeaderTemplate和DataBinding

Coo*_*web 6 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>
Run Code Online (Sandbox Code Playgroud)

jpi*_*son 24

问题是,HeaderTemplate用于模板标题因此在HeaderTemplate你的DataContext内容中,无论你绑定什么或分配给Header你的属性GroupBox.

将该Header属性视为DataContext控件的标题.通常,DataContext属性会从其父级中获取其值,但由于并非所有控件都具有Header空白,除非您设置它.

通过将Header显式绑定到当前的DataContext,Header="{Binding}"您的示例应该按预期工作.为了帮助说明是如何工作的,我创建了低于一个简单的例子说明了如何HeaderDataContext相互独立工作的要么身体或控制的头提供数据.

<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>
Run Code Online (Sandbox Code Playgroud)

这将产生GroupBox如下所示的内容.

具有模板化标题的GroupBox

我认为默认情况下databinding,wpf总是从DataContext属性中获取数据.似乎没有datatemplate

你的假设是正确的DataContext,它确实有效,DataTemplate因为我已经证明了它只是在Header的模板中,DataContext是来自Header属性的值,而不是DataContext本身.

  • +1,这个信息真的有助于标题在组合框中的工作方式! (2认同)

geh*_*hho 7

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

<Binding Path="DataContext.CurrentContract.Type" Converter="{StaticResource contractTypeConverter}" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}">
Run Code Online (Sandbox Code Playgroud)


小智 6

    <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>
Run Code Online (Sandbox Code Playgroud)

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