Привязка данных к ComboBox

Я попал в блокпост с привязкой данных к a ComboBox. Я разрабатываю приложение в Windows Phone 8.1 и просто все, что я хочу сделать, это список принтеров в ComboBox.

Это мой XAML:

<ComboBox x_Name="cbxPrinters" 
          HorizontalAlignment="Left"
          Margin="153,150,0,0" 
          VerticalAlignment="Top" 
          Width="237">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" Margin="2">
                <TextBlock Text="{Binding Name}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Это класс, который заполняет список. Данные возвращаютсяId|Name|Id|Name|Id|Name etc, поэтому существует SplitFor[...]Nextоператор and. Этот бит кода заполняет класс и добавляет их в список. В конце я оставляю список из 54 принтеров:

Public Class Printer

Public Id As Integer
Public Name As String

Public Function Populate(ByVal ResultString As String) As List(Of Printer)

    Dim _Results As List(Of String) = ResultString.Split(New String("|")).ToList

    Dim _Printers As New List(Of Printer)

    If _Results.Count >= 2 Then

        For i = 0 To _Results.Count - 1 Step 2
            Dim _Printer As New Printer

            With _Printer
                .Id = _Results(i)
                .Name = _Results(i + 1).Trim()
            End With

            _Printers.Add(_Printer)
        Next
    End If

    Return _Printers

End Function

End Class

Этот бит кода назначает List(Of Printer)ComboBox:

Protected Overrides Async Sub OnNavigatedTo(e As NavigationEventArgs)

    _Printer = New Printer

    _Printers = _Printer.Populate(Await GetPrinterList())

    If _Printers.Count > 0 Then
        cbxPrinters.ItemsSource = _Printers
    End If

End Sub

Когда я запускаю приложение и прихожу на эту страницу, код работает нормально, однако я остаюсь с тем, что выглядит как 54 пустых варианта, чтобы выбрать из.

1 ответ

  1. С помощью Zaggler и после исследования трассировки стека:

    Ошибка: Ошибка пути BindingExpression: свойство ‘ Id ‘не найдено на’ COACH_HOUSE_SCAN_APP.Принтер, COACH HOUSE SCAN APP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null’.`

    Я немного изменил класс так что Idи Nameсейчас Properties:

    Public Property Id As Integer
    Public Property Name As String
    

    Я установил DisplayMemberPathи SelectedValuePathкак предложил Zaggler:

    Protected Overrides Async Sub OnNavigatedTo(e As NavigationEventArgs)
    
        _Printer = New Printer
    
        _Printers = _Printer.Populate(Await GetPrinterList())
    
        If _Printers.Count > 0 Then
            cbxPrinters.ItemsSource = _Printers
            cbxPrinters.DisplayMemberPath = "Id"
            cbxPrinters.SelectedValuePath = "Name"
        End If
    
    End Sub
    

    Я также удалил эту часть XAML:

    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" Margin="2">
                <TextBlock Text="{Binding Name}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
    

    Оставляя XMAL похожим на это:

    <ComboBox x_Name="cbxPrinters" 
          HorizontalAlignment="Left"
          Margin="153,150,0,0" 
          VerticalAlignment="Top" 
          Width="237">
    </ComboBox>
    

    Это исправило мою проблему, и теперь принтеры теперь перечислены ComboBoxв.