Установка цвета переднего плана всех комбинированных списков на другой цвет (в зависимости от selectedItem) - PullRequest
0 голосов
/ 03 февраля 2019

Я делаю настольное приложение WPF для своих школьных товарищей, чтобы они могли практиковаться в немецком прошедшем времени.В настоящее время я могу сгенерировать 8 случайных вопросов из текстового файла и заполнить поля со списком правильных ответов.Моя текущая цель состоит в том, чтобы изменить цвет переднего плана комбинированных списков на зеленый / красный после того, как пользователь нажмет кнопку оценки.Цвет переднего плана меняется на зеленый, если пользователь выбирает правильный ответ, и красный, если он выбирает неправильный ответ.

В моем тестовом классе я инициализирую ObservableCollection для своих ответов, вопросов и правильных ответов.Затем прочитайте построчно текстовый файл и заполните ObservableCollections соответственно.В моем MainWindow я установил DataConext для своего экземпляра Test Class и связал выпадающие списки с ObservableCollection с соответствующими ответами.Я могу достичь желаемого результата в коде позади (показано в коде ниже).Однако, если бы у меня было больше режимов тестирования, чем, например, одного, мне пришлось бы оценивать и изменять цвет в каждом окне кода, что представляется непрактичным.

Таким образом, моей конечной целью было бы создать каким-либо образом триггер (например, в App.Resources) для всех комбинированных списков с x: Key = "ExamComboBoxStyle", который будет запущен, если пользовательнажимает на кнопку оценки и меняет цвет переднего плана в зависимости от выбранного ответа.Есть ли умный способ сделать это в XAML?

У меня есть некоторые связанные потоки stackoverflow, но, к сожалению, я не смог применить их в соответствии со своими потребностями, так как я довольно плохо знаком с XAML и WPF.

Текст текстового блока WPFне изменяется динамически при выборе элемента в выпадающем списке

привязка ComboBox SelectedValue или SelectedItem WPF C #

Условное изменение переднего плана элемента ComboBox WPF в зависимости отзначение в элементе данных ItemsSource

Тестовый класс:

class Test : INotifyPropertyChanged {
    List<string> questionsAndAnswers = new List<string> ();
    List<int> questionsOrder = new List<int> ();
    List<int> generatedNumbers = new List<int> ();

    private ObservableCollection<string> _questions;
    public ObservableCollection<string> questions {
        get { return _questions; }
        set {
            _questions = value;
        }
    }
    private ObservableCollection<ObservableCollection<string>> _listOfQuestionsList;
    public ObservableCollection<ObservableCollection<string>> listOfQuestionsList {
        get { return _listOfQuestionsList; }
        set {
            _listOfQuestionsList = value;
        }
    }
    private ObservableCollection<string> _answersForCombobox;
    public ObservableCollection<string> answersForCombobox {
        get { return _answersForCombobox; }
        set {
            _answersForCombobox = value;
        }
    }
    private ObservableCollection<string> _correctAnswers;
    public ObservableCollection<string> correctAnswers {
        get { return _correctAnswers; }
        set {
            _correctAnswers = value;
        }
    }
    public Test() {
        answersForCombobox = new ObservableCollection<string> ();
        questions = new ObservableCollection<string> ();
        listOfQuestionsList = new ObservableCollection<ObservableCollection<string>> ();
        correctAnswers = new ObservableCollection<string> ();
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string property) {
        if (PropertyChanged != null) {
            PropertyChanged (this, new PropertyChangedEventArgs (property));
        }
    }

MainWindow:

public partial class MainWindow : Window
{

    Test newTest = new Test();
    public MainWindow()
    {
        InitializeComponent();
        DataContext = newTest;
        newTest.GetVerbsFromFile();
        newTest.AddingQuestionsAndAnswers();
    }
    private void evaluateButton_Click(object sender, RoutedEventArgs e)
    {
        if (AnswerCombobox1.SelectedValue == newTest.correctAnswers[0]) {
            AnswerCombobox1.Foreground = Brushes.LimeGreen;
        } else {
            AnswerCombobox1.Foreground = Brushes.Red;
        }
        if (AnswerCombobox2.SelectedValue == newTest.correctAnswers[1]) {
            AnswerCombobox2.Foreground = Brushes.LimeGreen;
        } else {
            AnswerCombobox2.Foreground = Brushes.Red;
        }
        if (AnswerCombobox3.SelectedValue == newTest.correctAnswers[2]) {
            AnswerCombobox3.Foreground = Brushes.LimeGreen;
        } else {
            AnswerCombobox3.Foreground = Brushes.Red;

.......

        if (AnswerCombobox8.SelectedValue == newTest.correctAnswers[7]) {
            AnswerCombobox8.Foreground = Brushes.LimeGreen;
        } else {
            AnswerCombobox8.Foreground = Brushes.Red;
        }
    }
}

}

XAML:

    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <TextBlock 
            Style="{StaticResource AnswersTextBlockStyle}"
            Name="Question1" 
            Text="{Binding questions[0]}" 
            Grid.Column="0" 
            Grid.Row="1" />
        <ComboBox 
            Style="{StaticResource ExamComboBoxStyle}"
            Name="AnswerCombobox1"  
            ToolTip="{Binding correctAnswers[0]}"  
            ItemsSource="{Binding listOfQuestionsList[0]}" 
            Grid.Column="1" 
            Grid.Row="1"/>
    </Grid>

.................

    <Grid Grid.Row="9">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Button 
                Name="graphsButton"
                Content="graphs"
                Click="graphsButton_Click" Grid.Column="1" Margin="598.2,0,-759.4,-0.2" />
        <Button 
                Name="evaluateButton"
                Content="evaluate"
                Click="evaluateButton_Click" Grid.Column="2" Margin="395.4,0,-556.6,0" />
    </Grid>

Justчтобы было более понятно, как должен выглядеть мой желаемый результат:

До оценки: before evaluation

После оценки: after evaluation

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