使用WPF在表格中分组并显示一组事件

我经历了一些WPF的建议; 我有一个定义时间,事件类型和描述的对象列表,如下所示:

public class AnEvent
{
    public EventType EventType { get; set; }
    public DateTime TimeStamp { get; set; }
    public string Description { get; set; }
}

我想显示这样的项目的集合:

-------------------------------------
|   Time    |   Type1   |   Type3   |
-------------------------------------
|   12:00   |  Event1   |           |
-------------------------------------
|   12:01   |  Event2   |  Event4   |
|           |  Event3   |           |
-------------------------------------
|   12:05   |           |  Event5   |
-------------------------------------
  • 多个事件可以同时发生,它们应该显示在同一个“单元格”中
  • 该表应该只显示集合中存在的事件类型的列,因为存在的事件类型可能会有所不同。
  • 将会有15-20个EventTypes,但给定集合中只有3或4个。
  • 在WPF中显示这些数据的最佳方式是什么?

    我考虑过使用Grid,但我不知道如何去做

  • 动态生成列
  • 动态生成行
  • 将行和列分配给对象(我会使用数据模板来定义如何基于事件呈现ViewModel)
  • 我还考虑过预处理事件列表,以便按时间生成事件集合,然后按照类型生成事件集合,然后使用多个ItemsControl来显示不同的级别。

    我的其他选择是什么?

    谢谢!


    我建议你写一个简单的虚拟机

    public class EventLogByTimeViewModel : ViewModelBase
    {
        public DateTime Time { get; set; }
        public ObservableCollection<AnEvent> Type1Collection { get; set; }
        public ObservableCollection<AnEvent> Type3Collection { get; set; }
    }
    

    并创建一个工厂,您将提供一个AnEvent列表,并输出一个虚拟机列表

    public interface IEventLogByTimeVMFactory
    {
        IList<EventLogByTimeViewModel> GenerateVM(IList<AnEvent>);
    }
    

    您可以确实使用工厂实现中Linq扩展中的GroupBy方法来实现更简单的过程。

    然后在高级视图模型(您绑定到DataContext的模型)中,公开并实现EventLogByTimeViewModel的集合

    public class MainViewModel : ViewModelBase
    {
        private IEventLogByTimeVMFactory _factory;
    
        public MainViewModel()
        {
            EventLogs = new ObservableCollection<EventLogByTimeViewModel>();
            _factory = new MyFactoryImplementation();
        }
    
        public ObservableCollection<EventLogByTimeViewModel> EventLogs { get; set; }
    
        public void LoadData(IList<EventEventLogByTimeViewModel> eventLogs)
        {
            var vms = _factory.GenerateVM(eventLogs);
    
            EventLogs.Clear();
    
            foreache(vm in vms)
            {
                EventLogs.Add(vm);
            }
        }
    }
    

    您将调用LoadData方法的机制取决于您。

    最后,在你的用户界面中,我鼓励你使用DataGrid控件,将EventLogs属性绑定到它的ItemsSource并最终为Type1和Type3列实现DataTemplate ,这些列将显示ItemsControlEventType集合。

    链接地址: http://www.djcxy.com/p/64733.html

    上一篇: Grouping and displaying a collection of events in a table with WPF

    下一篇: Select arbitrary text in a WPF datagrid row or cell and copy it