Комплекс WPF Combobox - PullRequest
       5

Комплекс WPF Combobox

1 голос
/ 16 мая 2019

Я изучаю 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 с последующими значениями в объекте списка принтеров.

Может кто-нибудь объяснить, как это сделать с помощью VB (я могу найти несколько примеров на C #, но я не так уж уверен с таким переводом между языками) - я перевожу несколько программ WinForms в WPF и пока не хочу менять внутреннюю часть VB.

Вся помощь приветствуется.

1 Ответ

1 голос
/ 16 мая 2019

Моя проблема в том, что я пытаюсь выяснить, как на самом деле привязать отдельные значения из запроса WMI к последующим значениям в объекте списка принтеров.

Боюсь, вы не можете напрямую связать отдельные значения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...