将数据绑定到 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
返回,这就是为什么有 Split
和 For[...]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,因此 Id
和 Name
现在是 Properties
:
Public Property Id As Integer
Public Property Name As String
我已经按照 Zaggler 的建议设置了 DisplayMemberPath
和 SelectedValuePath
:
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
。
我遇到了将数据绑定到 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
返回,这就是为什么有 Split
和 For[...]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,因此 Id
和 Name
现在是 Properties
:
Public Property Id As Integer
Public Property Name As String
我已经按照 Zaggler 的建议设置了 DisplayMemberPath
和 SelectedValuePath
:
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
。