我将一个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>
答案 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
,如下所示。
我认为默认情况下
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>