2014-03-02 34 views
0

我经历了一些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中显示此数据的最佳方式?

我使用网格考虑,但我不知道如何

  • 动态生成列
  • 动态生成行
  • 指定行和列的对象(我'd使用数据模板来定义如何根据事件呈现ViewModel)

我也考虑过预处理事件列表以便按时间生成事件集合,然后是一个colle通过类型内的类型事件,然后使用几个ItemsControl来显示不同的级别。

我的其他选择是什么?

谢谢!

+0

是种量总是将是相同的,或者他们将是动态的? –

+0

EventType是不会更改的枚举,但项目集合并不总是包含由EventType定义的所有条目。 – RSlaughter

+0

好的..在sol上工作。现在 –

回答

0

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

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

,并创建一个工厂,你将提供AnEvent的列表,这将输出VM

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方法的mecanism是由你。

最后在你的用户界面,我鼓励你使用DataGrid控制,绑定EventLogs属性,其ItemsSource终于实现DataTemplate两个Type1和类型3列,将显示一个ItemsControlEventType集合。

+0

我认为是这样的,但如果Type2不在集合中,我不希望它被显示。更新我的示例以尝试更清晰。 – RSlaughter

+0

然后,不要将其包含在分组视图模型中。我更新了。 – Ucodia

+0

集合是动态加载的,因此每次都会有一组不同的事件,因此会有一组不同的EventType。在一种情况下,它可能具有EventTypes 1和2,在另一种情况下只有2和3。 – RSlaughter