我正在学习WPF,并开始练习正确的数据绑定,需要建立安装在计算机(本地+网络)上的打印机的列表,并根据本地和网络布尔值对它们进行适当的分组。
目前,我正在加载以下代码:
VB:
Class MainWindow
Public Property printerlist As New ObservableCollection(Of String)
Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
InitializeComponent()
Me.DataContext = Me
'WMI Stuff
Dim objMS As System.Management.ManagementScope = New System.Management.ManagementScope(ManagementPath.DefaultPath)
objMS.Connect()
'Query Printers
Dim objquery As SelectQuery = New SelectQuery("SELECT * FROM Win32_Printer")
Dim objMOS As ManagementObjectSearcher = New ManagementObjectSearcher(objMS, objquery)
Dim objMOC As System.Management.ManagementObjectCollection = objMOS.Get()
For Each Printers As ManagementObject In objMOC
If CBool(Printers("Local")) Then
printerlist.Add(Printers("Name"))
End If
If CBool(Printers("Network")) Then
printerlist.Add(Printers("Name"))
End If
Next
End Sub
XAML:
<ComboBox x:Name="Printer_Select" ItemsSource="{Binding Path=printerlist}"/>
这将成功显示本地打印机列表,并按“本地”和“网络”对它们进行排序。
我在下面构建了更高级的组合框:
<ComboBox x:Name="Printer_Select" ItemsSource="{Binding Path=printerlist}">
<ComboBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Type}"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ComboBox.GroupStyle>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding DeviceName}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
我的问题是我正在努力研究如何将WMI查询中的各个值实际绑定到printerlist对象中的后续值。
有人可以解释如何使用VB做到这一点(我可以找到几个C#示例,但我不太习惯以这种方式在两种语言之间进行翻译)-我正在将许多WinForms程序移至WPF,而没有暂时还不需要更改VB后端。
感谢所有帮助。
答案 0 :(得分:1)
我的问题是我正在努力研究如何将WMI查询中的各个值实际绑定到printerlist对象中的后续值。
恐怕您不能直接绑定ManagementObject
的各个值,因为它们不会使用公共属性公开。
您可以创建自己的类型:
Public Class YourType
Public Property DeviceName As String
'+ all other properties that you want to display...
End Class
...并将printerlist
的类型从ObservableCollection(Of String)
更改为ObservableCollection(Of YourType)
,然后在循环中创建YourType
对象:
For Each Printers As ManagementObject In objMOC
printerlist.Add(New YourType With {.DeviceName = Printers("DeviceName")})
Next