Your Privacy Matters: We use our own and third-party cookies to improve your experience on our website. By continuing to use the website we understand that you accept their use. Cookie Policy
1405
Template RecordSelector header
posted

Hy.

I have a question about the RecordSelector's header for the XamDataGrid.

I have a XamDataGrid for which I have changed the template for the RecordSelector to contain a checkbox for selecting the records. This checkbox it's bounded to a property of the objects displayed inside the grid. Everything work's fine. But I would like to change the header of the RecordSelector to contain also a checkbox, with the select all functionality. I have no idea how to reference the header of the RecordSelector. Is there a way to do this?

Here is my template for the RecordSelector:

<Style x:Key="CheckBoxSelector" TargetType="{x:Type dataPresenter:RecordSelector}">

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="{x:Type dataPresenter:RecordSelector}">

<CheckBox IsChecked="{Binding Path=DataItem.Selected, Mode=TwoWay}" VerticalAlignment="Center" HorizontalAlignment="Center"/>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

Thanks very much

Nico

Parents Reply
  • 6867
    posted in reply to Nicoleta Oprescu

    I moled the XamDataGrid's visual tree and discovered that the field labels are all contained within a Grid panel.  The "header" of the row selectors "column" is really just some empty space in that Grid.  So, with a little XAML magic, and the use of the endlessly useful Infragistics.Windows.Utilities class, I found a way to put a CheckBox in that empty area.  Here's what I did...

    <igDP:XamDataGrid DataSource="{Binding}">
      <igDP:XamDataGrid.Resources>
        <Style TargetType="{x:Type igDP:RecordSelector}">
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="{x:Type  igDP:RecordSelector}">
                <CheckBox
                  IsChecked="{Binding Path=DataItem.Selected, Mode=TwoWay}"
                  VerticalAlignment="Center"
                  HorizontalAlignment="Center"
                  />
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
      </igDP:XamDataGrid.Resources>
      <igDP:XamDataGrid.FieldLayouts>
        <igDP:FieldLayout>
          <igDP:FieldLayout.Fields>
            <igDP:Field Name="Name">
              <igDP:Field.Settings>
                <igDP:FieldSettings>
                  <igDP:FieldSettings.LabelPresenterStyle>
                    <Style TargetType="{x:Type igDP:LabelPresenter}">
                      <EventSetter Event="Loaded" Handler="OnNameLabelLoaded" />
                    </Style>
                  </igDP:FieldSettings.LabelPresenterStyle>

                </igDP:FieldSettings>
              </igDP:Field.Settings>
            </igDP:Field>
            <igDP:Field Name="Status" />
          </igDP:FieldLayout.Fields>
        </igDP:FieldLayout>
      </igDP:XamDataGrid.FieldLayouts>
    </igDP:XamDataGrid>

    void OnNameLabelLoaded(object sender, RoutedEventArgs e)
    {
        // using Infragistics.Windows
        FrameworkElement site = Utilities.GetAncestorFromName(
            e.OriginalSource as DependencyObject,
            "PART_HeaderContentSite");

        if (site == null)
            return;

        Grid siteHost = Utilities.GetAncestorFromType(
            site,
            typeof(Grid),
            false)
            as Grid;

        if (siteHost == null)
            return;

        foreach (UIElement elem in siteHost.Children)
            if (elem is CheckBox)
                return;

        CheckBox chk = new CheckBox();
        chk.Click += new RoutedEventHandler(chk_Click);
        Grid.SetColumnSpan(chk, 3);           
        chk.Margin = new Thickness(4, 0, 0, 0);
        chk.VerticalAlignment = VerticalAlignment.Center;

        siteHost.Children.Add(chk);
    }

    void chk_Click(object sender, RoutedEventArgs e)
    {
        // TODO: Check/uncheck all other CheckBoxes.
    }

Children