复杂的WPF组合框

时间:2019-05-16 11:09:47

标签: wpf vb.net data-binding

我正在学习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后端。

感谢所有帮助。

1 个答案:

答案 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