如何在特定条件下对DataGrid中的数据进行分组?

时间:2016-07-16 11:34:55

标签: c# .net wpf mvvm wpfdatagrid

如果GridView的{​​{1}}为State且所有其他选项都没有任何群组,我如何进入InProgress创建群组?

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"));
        }
    }

目前,我已为State的每个变体创建了一个组,但这样的选项并不适合我。

<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

2 个答案:

答案 0 :(得分:3)

如果我理解正确,这可能会按您希望的方式分组: Xaml仍未触动!

<强>模型

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; }


        }

<强>转换器

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();
            }
        }

<强>用法

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

答案 1 :(得分:2)

请查看这是否解决了您的问题:

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();