How to group data in a DataGrid under a certain condition?

How do I get GridViewto create groups for State, if it has InProgress, and all other parameters were without any group?

public class RecordVm: VmBase
    {
        public int Id { get; set; }
        public string Description { get; set; }
        public State State { get; set; }
        public bool IsCompeleted { get; set; }
    }
    public enum State
    {
        Empty, Opened, InProgress, Completed
    }

     public class MainVm : VmBase
    {
        public ObservableCollection<RecordVm> RecordVms { get; } = new ObservableCollection<RecordVm>();

        public ListCollectionView ListCollection {get;}

        public MainVm()
        {
            ListCollection = new ListCollectionView(RecordVms);
            ListCollection.GroupDescriptions?.Add(new PropertyGroupDescription("State"));
        }
    }

At the moment I have created a group for each of the state options, but this option does not suit me.

<DataGrid ItemsSource="{Binding ListCollection}"
      Style="{StaticResource AzureDataGrid}"
      RowStyle="{DynamicResource DataGridRowStyleStateGreen}">
<DataGrid.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Path=Name}" />
                </StackPanel>
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
        <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                            <Expander>
                                <Expander.Header>
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{Binding Path=Name}" />
                                        <TextBlock Margin="5,0,0,0" Text="{Binding Path=ItemCount}"/>
                                        <TextBlock Text=" Items"/>
                                    </StackPanel>
                                </Expander.Header>
                                <ItemsPresenter />
                            </Expander>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </GroupStyle.ContainerStyle>
    </GroupStyle>
</DataGrid.GroupStyle>

enter code here
+4
source share
2 answers

If you understand correctly, this can be grouped the way you want: Xaml remains untouched!

Model

public class RecordVm 
        {
            public int Id { get; set; }
            public string Description { get; set; }
            public State State {
                get { return this._state; }
                set { this._state = value;
                    if (value == State.InProgress)
                        this.InProgress = true;return;
                    this.InProgress = false; }
            }
            private State _state;
            public bool IsCompeleted { get; set; }

            public bool InProgress { get; private set; }


        }

Converter

public class DisplayConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value == null) return "";
                if ((bool) value) return "In Progress";
                return "Finished";
            }

            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }

Using

ListCollection.GroupDescriptions?.Add(new PropertyGroupDescription("InProgress", new DisplayConverter()));
+3
source

See if this issue resolves:

ListCollection = new ListCollectionView(RecordVms);
ListCollection.GroupDescriptions?.Add(new PropertyGroupDescription("State"));
ListCollection.Refresh();

CollectionViewGroup group = (CollectionViewGroup) ListCollection.Groups[0];

ListCollectionView viewOfGroup1 = new ListCollectionView(group.Items);            
viewOfGroup1.Filter = ((i) => { return ((RecordVm)i).State == State.InProgress; });
viewOfGroup1.Refresh();
+2
source

Source: https://habr.com/ru/post/1648088/


All Articles