8

ヘッダーテンプレートを 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>

4

5 に答える 5

26

問題は、HeaderTemplateがヘッダーのテンプレート化に使用されるため、 のプロパティにバインドまたは割り当てたものはすべて内にありHeaderTemplateます。DataContextHeaderGroupBox

プロパティは、コントロールのヘッダーの と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>

これにより、GroupBox次のような a が生成されます。

テンプレート化されたヘッダーを持つ GroupBox

databindingデフォルトでは、wpf は常にプロパティからデータを取得すると思いDataContextます。入っていないようですdatatemplate

あなたの仮定は正しいです。私が示したように、ヘッダーのテンプレートでは、DataContext はヘッダー プロパティの値であり、DataContext 自体ではありませんDataContextDataTemplate

于 2011-02-12T02:53:57.447 に答える
7

GroupBox には「CurrentContract」というメンバーがありません。おそらく、対応する ViewModel から「CurrentContract」というプロパティにアクセスしたいですか?! ViewModel は GroupBox の DataContext であるため、バインディング パスを次のように変更する必要があります...

<Binding Path="DataContext.CurrentContract.Type" Converter="{StaticResource contractTypeConverter}" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}">
于 2010-03-11T13:17:48.363 に答える
1

上記の教訓は一般的に DataTemplates に役立ちますが、最近、グループボックスのヘッダーを変更するためのより良い方法があることがわかりました。

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

この方法では、バインディングで相対ソースを定義する必要はありません。

また、GroupBoxes とヘッダーに関するこの問題にも注意してください。

于 2010-06-21T13:04:09.800 に答える