WPF GroupBox HeaderTemplate и DataBinding - PullRequest
6 голосов
/ 11 марта 2010

Я определяю шаблон заголовка в групповое поле 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 ]

23 голосов
/ 12 февраля 2011

Проблема в том, что HeaderTemplate используется для шаблонирования Заголовка, поэтому в HeaderTemplate ваше DataContext есть все, что вы связываете или присваиваете свойству Header вашего GroupBox.

Думайте о свойстве Header почти как о DataContext для заголовка элемента управления. Обычно свойство DataContext наследует свое значение от своего родителя, но поскольку не у каждого элемента управления есть 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, который выглядит следующим образом.

GroupBox with templated header

Я думаю, что по умолчанию в databinding wpf всегда получает данные из свойства DataContext. Кажется не в datatemplate

Ваше предположение о DataContext верно, и оно работает в DataTemplate, как я продемонстрировал, просто в шаблоне заголовка DataContext - это значение из свойства заголовка, а не сам DataContext.

4 голосов
/ 04 августа 2011
    <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>

Просто распространите DC GroupBox на содержимое DataTemplate ... работает как шарм ...

3 голосов
/ 11 марта 2010

В GroupBox нет члена с именем CurrentContract. Скорее всего, вы хотите получить доступ к свойству с именем "CurrentContract" из соответствующей ViewModel ?! ViewModel - это DataContext GroupBox, поэтому вы должны изменить пути привязки на что-то вроде ...

<Binding Path="DataContext.CurrentContract.Type" Converter="{StaticResource contractTypeConverter}" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}">
1 голос
/ 21 июня 2010

Урок, полученный выше, в целом полезен для DataTemplates, но я недавно обнаружил, что есть лучший способ изменить заголовок группового блока:

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

Таким образом, нет необходимости определять относительный источник в привязках.

Также обратите внимание на эту проблему с GroupBoxes и заголовком.

0 голосов
/ 20 февраля 2018

Вот что у меня сработало:

<HeaderedContentControl Header="{Binding}" Style="{StaticResource TallHeaderedContentStyle}">
  <HeaderedContentControl.HeaderTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Path=HeaderText"} />
    </DataTemplate>
  </HeaderedContentControl.HeaderTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...