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很棒。:)