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
  • 6867
    posted

    Nico Oprescu said:
    But I would like to change the header of the RecordSelector to contain also a checkbox, with the select all functionality.

     

    Hi Nico,

    I don't understand what this means.  Please clarify what it means to have "select all functionality" exposed in the header of a RecordSelector.  What is the "all" that is being selected?  All of the child records?  All of the checkboxes in the record? What is the problem that you're facing when trying to implement this?

    Thanks,

    Josh

  • 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.
    }

Reply Children