У меня есть следующий код WinForm по этой ссылке: http://net-informations.com/q/faq/combovalue.html
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim comboSource As New Dictionary(Of String, String)()
comboSource.Add("1", "Sunday")
comboSource.Add("2", "Monday")
comboSource.Add("3", "Tuesday")
comboSource.Add("4", "Wednesday")
comboSource.Add("5", "Thursday")
comboSource.Add("6", "Friday")
comboSource.Add("7", "Saturday")
ComboBox1.DataSource = New BindingSource(comboSource, Nothing)
ComboBox1.DisplayMember = "Value"
ComboBox1.ValueMember = "Key"
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim key As String = DirectCast(ComboBox1.SelectedItem, KeyValuePair(Of String, String)).Key
Dim value As String = DirectCast(ComboBox1.SelectedItem, KeyValuePair(Of String, String)).Value
MessageBox.Show(key & " " & value)
End Sub
End Class
Я попытался преобразовать приведенные выше коды WinForm в коды WPF, как показано ниже.
xaml
<Window x:Class = "MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
Title = "MainWindow" Height = "350" Width = "525">
<StackPanel>
<Button x:Name = "Button1" Height = "25" Width = "100" Content = "Click Me"/>
<ComboBox x:Name = "ComboBox1" Height = "25" Width = "200"/>
</StackPanel>
</Window>
код позади
Class MainWindow
Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
Dim comboSource As New Dictionary(Of String, String)()
comboSource.Add("1", "Sunday")
comboSource.Add("2", "Monday")
comboSource.Add("3", "Tuesday")
comboSource.Add("4", "Wednesday")
comboSource.Add("5", "Thursday")
comboSource.Add("6", "Friday")
comboSource.Add("7", "Saturday")
ComboBox1.DataSource = New BindingSource(comboSource, Nothing)
ComboBox1.DisplayMember = "Value"
ComboBox1.ValueMember = "Key"
End Sub
Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click
Dim key As String = DirectCast(ComboBox1.SelectedItem, KeyValuePair(Of String, String)).Key
Dim value As String = DirectCast(ComboBox1.SelectedItem, KeyValuePair(Of String, String)).Value
MessageBox.Show(key & " " & value)
End Sub
End Class
Но я сталкиваюсь с некоторыми ошибками, как вы можете видеть на этом рисунке: https://prnt.sc/na5iie
Итак, как я могу решить эти ошибки?
В WPF мы задаем исходный список элементов ComboBox с помощью ItemsSource
, а не DataSource
, и это работает немного по-другому.
Каждый предмет может быть любым объектом, который вы хотите использовать, имея в виду, что сам объект является вашим ValueMember
. В вашем случае использование словаря по умолчанию даст вид «[1, воскресенье]» для каждого элемента, потому что элемент будет иметь тип KeyValuePair(Of String, String)
.
Чтобы оформить его так, как вам хотелось бы, проще всего использовать шаблоны XAML, например такие:
<ComboBox ItemsSource = "{Binding comboSource}">
<ComboBox.ItemTemplate>
<DataTemplate>
<Label Content = "{Binding Value}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Тогда SelectedItem
ComboBox будет KeyValuePair
, поэтому просто используйте его Key
, когда вам нужно использовать выбранный элемент в другом месте, как предполагалось.
Возможно, контрольный список этого вопроса (которое написано пользователем с самой высокой репутацией) может помочь вам написать лучшие вопросы.