将数据绑定到 ComboBox

Binding data to a ComboBox

我遇到了将数据绑定到 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>

这是填充列表的 class。数据作为 Id|Name|Id|Name|Id|Name etc 返回,这就是为什么有 SplitFor[...]Next 语句的原因。这段代码确实填充了 class 并将它们添加到列表中。最后我得到了 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

当我启动应用程序并来到此页面时,代码运行正常,但我留下了看起来像 select 的 54 个空白选项。

Zaggler 的帮助下并在调查堆栈跟踪后:

Error: BindingExpression path error: 'Id' property not found on 'COACH_HOUSE_SCAN_APP.Printer, COACH HOUSE SCAN APP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.`

我稍微更改了 class,因此 IdName 现在是 Properties:

Public Property Id As Integer
Public Property Name As String

我已经按照 Zaggler 的建议设置了 DisplayMemberPathSelectedValuePath

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