如何在特定条件下对数据网格中的数据进行分组
本文关键字:数据 网格 数据网 条件下 | 更新日期: 2023-09-27 17:57:08
如果他InProgress
,我如何进入GridView
为State
创建组,并且所有其他选项都没有任何组?
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"));
}
}
目前,我已经为状态的每个变体创建了一个组,但这样的选项不适合我。
<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
如果我理解正确,这可能会按照您想要的方式分组: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()));
请查看这是否解决了您的问题:
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();