wpf - 使用不同的源对 TreeView 进行分组

标签 wpf mvvm treeview binding

我是 WPF 世界的新手,我正在尝试根据 MVVM 设计模式实现一个应用程序。我在使用 TreeView 时遇到了一些问题。

我的模型是一个日志消息列表(来自不同的应用程序),具有以下属性:消息、严重性、应用程序。我有一个包含 6 个项目的集合,它们属于两个不同的应用程序。我希望我的 TreeView 如下所示:

应用 A
错误
第一条错误消息 (aaa)
第二条错误信息 (bbb)
警告
第一条警告消息 (ccc)
应用程序 B
警告
第一条警告消息 (ddd)
信息
第一条信息消息 (eee)
第二信息消息 (fff)

我目前的理解是期望有一个带有子列表的项目,所以为了创建我想要的 View ,我需要创建一个列表,其中包含一个字符串(应用程序名称)和一个子列表(不同的严重性)将包含子列表(显示消息)。

这对我来说没有意义,因为我在我的 View 和我的模型之间创建了依赖关系,假设将来我需要添加另一个层次结构层,我需要更改我的数据结构以支持

有没有办法只使用一个具有不同分组的列表?

谢谢。

最佳答案

您可以使用 CollectionView 轻松地对数据进行分组,甚至可以采用嵌套方式:

ObservableCollection<LogEntry> data = new ObservableCollection<LogEntry>(new LogEntry[]
{
    new LogEntry("App1", "Warning", "Msg1"),
    new LogEntry("App1", "Error", "Msg2"),
    new LogEntry("App1", "Warning", "Msg3"),
    new LogEntry("App2", "Error", "Msg4"),
    new LogEntry("App2", "Info", "Msg5"),
    new LogEntry("App2", "Info", "Msg6"),
});
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(data);
view.GroupDescriptions.Add(new PropertyGroupDescription("Application"));
view.GroupDescriptions.Add(new PropertyGroupDescription("Severity"));
Data = view;

(您也可以在 XAML 中创建 CollectionView View ,这只是一个示例)

现在您可以使用 DataTemplates 显示它:

<TreeView ItemsSource="{Binding Data.Groups}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type CollectionViewGroup}" ItemsSource="{Binding Items}">
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type local:LogEntry}">
            <TextBlock Text="{Binding Message}"/>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

看起来像这样:

关于wpf - 使用不同的源对 TreeView 进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5462713/

相关文章:

wpf - 使用C#移动鼠标

c# - 更新绑定(bind)源后如何执行 ICommand?

c# - Xamarin UWP 似乎绑定(bind)到错误的 View 模型

Javascript 检查/取消选中 TreeView 的所有按钮

C#、WPF、在 Treeview 中重用图像

c# - 如何在 TreeView 的每个节点旁边添加一个按钮?

c# - 64 位 Windows 上的 DirectX 应用程序

wpf - StopStoryboard 不会...停止 BeginStoryboard

wpf - 如何将图像字节 [] 延迟加载到 WPF 图像控件中?

android - Kotlin接口(interface)无法实例化!接口(interface)名称 : kotlinx. 协程.Deferred