Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 树视图分组_C#_Wpf_Mvvm_Treeview - Fatal编程技术网

C# 树视图分组

C# 树视图分组,c#,wpf,mvvm,treeview,C#,Wpf,Mvvm,Treeview,我的目标是从单个集合创建树视图,但根据特定属性对其进行分组,如下所示: (Alphabetical View) Test Machine 1 > Test Machine 2 |_ Test Device 1 |_ Test Device 2 > Test Machine 3 |_ Test Device 3 |_ Test Device 4 Test Machine 4 (Lo

我的目标是从单个集合创建树视图,但根据特定属性对其进行分组,如下所示:

(Alphabetical View)
      Test Machine 1
    > Test Machine 2
        |_ Test Device 1
        |_ Test Device 2
    > Test Machine 3
        |_ Test Device 3
        |_ Test Device 4
      Test Machine 4

(Location View)
    > Chicago
        |_ Test Machine 1
        |_ Test Machine 4       
    > Green Bay
        |_ Test Machine 3
        |_ Test Device 3
        |_ Test Device 4
    > Louisville
        |_ Test Machine 2
            |_ Test Device 1
        |_ Test Device 2

(Status View)
    > Connected
        |_ Test Machine 1
        |_ Test Machine 2
            |_ Test Device 1
            |_ Test Device 2
    > Disconnected
        |_ Test Machine 3
            |_ Test Device 3
            |_ Test Device 4

    > Unknown
        |_ Test Machine 4

(Device Type View)
    > Type A
        |_ Test Device 1
        |_ Test Device 3
    > Type B        
        |_ Test Device 2
        |_ Test Device 4
下面是我的课程的基本分类和上述示例的一些示例数据:

public class Machine
{
    public string MachineName { get; set;}
    public string Location { get; set;} 
    public IList<Device> Devices { get; set;}
    public Status Status { get; set;}
}

public class Device
{
    public string DeviceName { get; set;}
    public string DeviceType { get; set;}
}

public enum Status
{
    Unknown,
    Disconnected,
    Connected
}

public IList<Machine> Machines
{
    get 
    {
        return new IList<Machine>()
        {
            new Machine { MachineName = "Test Machine 1", Location = "Chicago", Status = Status.Connected, Devices = new List<Device>() },
            new Machine { MachineName = "Test Machine 2", Location = "Louisville", Status = Status.Connected, Devices = new List<Device>
                                                                                                                            {
                                                                                                                                new Device { DeviceName = "Test Device 1", DeviceType = "Type A"},
                                                                                                                                new Device { DeviceName = "Test Device 2", DeviceType = "Type B"},
                                                                                                                            }},
            new Machine { MachineName = "Test Machine 3", Location = "Green Bay", Status = Status.Disconnected, Devices = new List<Device>
                                                                                                                            {
                                                                                                                                new Device { DeviceName = "Test Device 3", DeviceType = "Type A"},
                                                                                                                                new Device { DeviceName = "Test Device 4", DeviceType = "Type B"},
                                                                                                                            } },
            new Machine { MachineName = "Test Machine 4", Location = "Chicago", Status = Status.Unknown, Devices = new List<Device>() }
        }
    }
}
公共类机器
{
公共字符串MachineName{get;set;}
公共字符串位置{get;set;}
公共IList设备{get;set;}
公共状态状态{get;set;}
}
公共类设备
{
公共字符串DeviceName{get;set;}
公共字符串设备类型{get;set;}
}
公共枚举状态
{
不详,
断开的,
有联系的
}
公共IList机器
{
得到
{
返回新的IList()
{
新机器{MachineName=“Test Machine 1”,Location=“Chicago”,Status=Status.Connected,Devices=new List()},
新机器{MachineName=“测试机器2”,Location=“路易斯维尔”,状态=状态。已连接,设备=新列表
{
新设备{DeviceName=“测试设备1”,DeviceType=“类型A”},
新设备{DeviceName=“测试设备2”,DeviceType=“类型B”},
}},
新机器{MachineName=“测试机器3”,Location=“绿色间隔”,状态=状态。已断开连接,设备=新列表
{
新设备{DeviceName=“测试设备3”,DeviceType=“类型A”},
新设备{DeviceName=“测试设备4”,DeviceType=“类型B”},
} },
新机器{MachineName=“Test Machine 4”,Location=“Chicago”,Status=Status.Unknown,Devices=new List()}
}
}
}
目前,我通过在主ViewModel中为每个TreeView分组创建一个子ViewModel来实现这一点。然后,按下按钮,我更改绑定到ContentControl的ViewModel。ContentControl然后能够使用隐式模板来专门为该分组绘制它


有没有一种方法可以使用CollectionViewSource及其所列的分组功能来实现这一点?我认为这将为我节省大约7个类…

如果您的项目数量很大,我打赌您当前的解决方案最适合,因为您可以应用线程

CollectionViewSource
Grouping
将是不可知的GUI线程,并且将失去
ThreeView
Virtualization


作为一名开发人员,我宁愿不减少类的数量,即使您太多,也可以。:-)

@elgonzo如果你这么认为,请投它一票,因为那样会更容易看到。我的工作解决方案可以在这里看到:。但这需要我再上7节课。哇,这是一个非常周到和有用的评论。我没有意识到分组和线程。另外,WPF也很棒!是的,WPF很棒。:)