Добавление текста и значения в ComboBox в WPF - PullRequest
0 голосов
/ 10 апреля 2019

У меня следующий код 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

Так, как я могу решить эти ошибки?

1 Ответ

1 голос
/ 10 апреля 2019

В WPF мы устанавливаем исходный список элементов ComboBox, используя ItemsSource, а не DataSource, и он работает немного по-другому.

Каждый элемент может быть любым объектом, который вы хотели бы использовать, имея в виду, что сам объект является вашим ValueMember. В вашем случае использование словаря по умолчанию создаст вид, подобный «[1, Sunday]» для каждого элемента, поскольку элемент будет иметь тип KeyValuePair(Of String, String).

Чтобы стилизовать его так, как вам хочется, проще всего использовать шаблоны XAML, например, такие:

<ComboBox ItemsSource="{Binding comboSource}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Label Content="{Binding Value}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Тогда ComboBox SelectedItem будет KeyValuePair, поэтому просто используйте его Key, когда вам нужно использовать выбранный элемент в другом месте, как предполагалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...