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?
<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
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
Hy Josh.
Thanks very much for the answer.
I changed the style of the RecordSelector to be a checkbox, so when you select a row from the grid, this will be checked or uncheked. But on the header of the RecordSelector coulmn I would like to have also a checkbox and when this is checked, to check all the checkboxes of the RecordSelector for all the records inside the grid (somethig like select all records from the grid). But I don't know how the header of the RecordSelector column it's called.......LabelPresenterRecordSelector?
If you have any other questions please let me know. Thanks a lot.
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.}
Hi Josh Smith,
I tried the code you provided for adding checkbox in the XamDataGrid using LabelPresenterStyle. Its working perfectly as expected behaviour.
But when I put the xamdatagrid in tab as tabitem and when i switch between the tabs, the checkbox state in the LabelPresenter is not maintained.It gets unchecked everytime on GUI when I switch between tabs.
Please let me know if any solution to this.
Sejal
Hi Josh,
I have implemented the application in somewhat different manner using your code.
I am attaching the sample code which I have implemented. Can you please go through it and let me know what is the problem?
When you will run it, the header checkbox state is not maintained when u switch between the tabs.
Thanks and Regards,
Hi Sejal,
I just downloaded the sample app on my blog post that shows how to put checkboxes in the record selectors. I put the sample's XamDataGrid into a TabItem, which is in a TabControl. I added another TabItem to the TabControl that had no content. When I run the app, I check a checkbox, select the other TabItem, and then select the TabItem with the XamDataGrid. After doing that, the checkboxes maintained their check state. So, I can't reproduce the problem you've listed. Does following those steps not work properly for you?