gpt4 book ai didi

c# - 如何将 WMI 集合显示到 WPF DataGrid

转载 作者:行者123 更新时间:2023-11-30 17:01:25 24 4
gpt4 key购买 nike

我刚开始使用 WPF,有点迷茫。

XAML 代码:

<DataGrid  Name="dgResults" AutoGenerateColumns="True" ItemsSource="{Binding}">
</DataGrid>

C#代码:

private void GetServices(string strComputer)
{
ManagementScope scope = new ManagementScope(@"\\" + strComputer + @"\root\cimv2");
SelectQuery query = new SelectQuery("Select * From Win32_Service");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection services = searcher.Get();
dgResults.ItemsSource = services;
}

我原以为 WMI Win32_Service 查询会将 WMI 属性显示为标题,并且返回集合中的每个对象都将显示为一行。但它显示了 ManagementObjectCollection 属性。有没有办法转换它并仍然允许访问所有属性?

如有任何帮助,我们将不胜感激。

最佳答案

这是一个有点棘手的事情。

首先,因为您不想显示 ManagementBaseObject 的 CLR 属性实例,你必须使用类型描述符概念来告诉绑定(bind)引擎,你有自定义的一堆属性。这是 CustomTypeDescriptor 的后代和 PropertyDescriptor 你需要:

internal sealed class ManagementObjectPropertDescriptor : PropertyDescriptor
{
private readonly PropertyData propertyData;

public ManagementObjectPropertDescriptor(PropertyData propertyData)
: base(propertyData.Name, null)
{
this.propertyData = propertyData;
}

public override bool CanResetValue(object component)
{
return false;
}

public override Type ComponentType
{
get { return typeof(ManagementObjectTypeDescriptor); }
}

public override object GetValue(object component)
{
return propertyData.Value;
}

public override bool IsReadOnly
{
get { return true; }
}

public override Type PropertyType
{
get { return propertyData.Value != null ? propertyData.Value.GetType() : typeof(object); }
}

public override void ResetValue(object component)
{
}

public override void SetValue(object component, object value)
{
}

public override bool ShouldSerializeValue(object component)
{
return false;
}
}

public sealed class ManagementObjectTypeDescriptor : CustomTypeDescriptor
{
private PropertyData[] managementObjectProperties;

public ManagementObjectTypeDescriptor(ManagementBaseObject source)
{
this.managementObjectProperties = source
.Properties
.Cast<PropertyData>()
.ToArray();
}

public override PropertyDescriptorCollection GetProperties()
{
return new PropertyDescriptorCollection(managementObjectProperties
.Select(p => new ManagementObjectPropertDescriptor(p))
.ToArray());
}
}

为简单起见,属性设为只读。
接下来需要转ManagementObjectCollection进入 ManagementObjectTypeDescriptor 的集合:

        ManagementScope scope = new ManagementScope(@"\\" + strComputer + @"\root\cimv2");
SelectQuery query = new SelectQuery("Select * From Win32_Service");

var typeDescriptors = new ObservableCollection<ManagementObjectTypeDescriptor>();

using (var searcher = new ManagementObjectSearcher(scope, query))
{
using (var managementObjects = searcher.Get())
{
foreach (ManagementBaseObject managementObject in managementObjects)
{
using (managementObject)
{
typeDescriptors.Add(new ManagementObjectTypeDescriptor(managementObject));
}
}
}
}

dgResults.ItemsSource = new ArrayList(typeDescriptors);

请注意,ItemsSourceIList 的非通用实现. DataGrid有一个错误,从我的角度来看,这里的行为:如果你将设置一个通用的 IList<ManagementObjectTypeDescriptor>作为项目来源,DG将忽略从 CustomTypeDescriptor 继承的事实,您将在网格中根本看不到任何列。同时,非泛型IList按预期工作。

关于c# - 如何将 WMI 集合显示到 WPF DataGrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21084445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com