Я делаю настольное приложение 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](https://i.stack.imgur.com/T7XmQ.jpg)
После оценки: ![after evaluation](https://i.stack.imgur.com/L0DwA.jpg)