События выбора поля со списком - PullRequest
0 голосов
/ 18 июня 2020

Добрый день. Я сделал несколько программ в формах Windows, и теперь начинаю исследовать новый красивый мир WPF. Первая проблема, с которой я столкнулся, что поле со списком WPF работает по-другому. Мой C# код:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void comboMenu_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (comboMenu.Text == "Meat soup")
        {
            textPrice.Text = "2.5";
            textDescription.Text = "Tasty and hearty soup with pieces of beaf and pork";
        }
        if (comboMenu.Text == "Vegetable soup")
        {
            textPrice.Text = "1.5";
            textDescription.Text = "Light and healthy soup with pieces of potato";
        }
        if (comboMenu.Text == "Chicken roll")
        {
            textPrice.Text = "3.5";
            textDescription.Text = "Fresh vegetables with pieces of chiken";
        }
    }
}

И код XAML вроде этого:

ComboBox x:Name="comboMenu" HorizontalAlignment="Left" Margin="26,30,0,0" VerticalAlignment="Top" Width="234" Grid.Row="2" Grid.Column="1" SelectionChanged="comboMenu_SelectionChanged">

        <ComboBoxItem Content="Meat soup"></ComboBoxItem>
        <ComboBoxItem Content="Vegetable soup"></ComboBoxItem>
        <ComboBoxItem Content="Chicken roll"></ComboBoxItem>
    </ComboBox>

Вот проблема. Поле со списком вообще игнорирует первое выбранное значение и не меняет текст в текстовых полях. Когда я что-то выбираю второй раз, текстовые поля путаются, и выбор меню не применяется к описанию. Я чувствую, что нужно что-то изменить в коде XAML. Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 18 июня 2020

WPF позволяет сосредоточиться на данных без особых манипуляций с элементами пользовательского интерфейса.

Объявить класс, содержащий информацию о пунктах меню:

public class Food
{
    public string Name { get; set; }
    public string Description { gt; set; }
    public double Price { get; set; }
}

заполнить поле со списком меню пунктами меню:

<ComboBox x:Name="comboMenu" DisplayMemberPath="Name" HorizontalAlignment="Left" Margin="26,30,0,0" VerticalAlignment="Top" Width="234" Grid.Row="2" Grid.Column="1">
    <local:Food Name="Meat soup" Price="2.5" Description="Tasty and hearty soup with pieces of beaf and pork"/>
    <local:Food Name="Vegetable soup" Price="1.5" Description="Light and healthy soup with pieces of potato"/>
</ComboBox>

используйте привязки к SelectedItem вместо события выбора для обновления информации о текущем выборе:

<TextBlock Name="textPrice" Text="{Binding SelectedItem.Price, ElementName=comboMenu}"/>

<TextBlock Name="textDescription" Text="{Binding SelectedItem.Description, ElementName=comboMenu}"/>
0 голосов
/ 15 июля 2020

Я решаю эту проблему, как сказал A Sh, но XAML в моем случае выглядит немного иначе.

<TextBlock Name="textPrice" DataContext="{Binding SelectedItem, ElementName=comboMenu}" Text="{Binding Path=Name}"/>

<TextBlock Name="textDescription" DataContext="{Binding SelectedItem, ElementName=comboMenu}" Text="{Binding Path=Description}"/>

Если это кому-то полезно.

0 голосов
/ 18 июня 2020

Не проверяйте comboMenu.Text, а comboMenu.SelectedItem, который в вашем случае является ComboBoxItem:

var selectedItem = (ComboBoxItem)comboMenu.SelectedItem;
var selectedText = (string)selectedItem.Content;

Если вы установите

<ComboBox SelectedValuePath="Content" ...>

, вы также можете используйте свойство SelectedValue:

var selectedText = (string)comboMenu.SelectedValue;

С декларацией пространства имен XAML

xmlns:sys="clr-namespace:System;assembly=mscorlib"

вы также можете использовать элементы string вместо ComboBoxItem

<ComboBox ...>
    <sys:String>Meat soup</sys:String>
    <sys:String>Vegetable soup</sys:String>
    <sys:String>Chicken roll</sys:String>
</ComboBox>

где теперь вы получаете SelectedItem, который является строкой:

var selectedText = (string)comboMenu.SelectedItem;

Вы также можете использовать оператор switch вместо нескольких операторов if:

switch (selectedText)
{
    case "Meat soup":
        textPrice.Text = "2.5";
        textDescription.Text = "Tasty and hearty soup with pieces of beaf and pork";
        break;
    case "Vegetable soup":
        textPrice.Text = "1.5";
        textDescription.Text = "Light and healthy soup with pieces of potato";
        break;
    case "Chicken roll":
        textPrice.Text = "3.5";
        textDescription.Text = "Fresh vegetables with pieces of chiken";
        break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...