我将一个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}"
您的示例应该按预期工作.为了帮助说明是如何工作的,我创建了低于一个简单的例子说明了如何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>
Run Code Online (Sandbox Code Playgroud)
这将产生GroupBox
如下所示的内容.
我认为默认情况下
databinding
,wpf总是从DataContext
属性中获取数据.似乎没有datatemplate
你的假设是正确的DataContext
,它确实有效,DataTemplate
因为我已经证明了它只是在Header的模板中,DataContext是来自Header属性的值,而不是DataContext本身.
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 内容...就像一个魅力...