#wpf #xaml #data-binding #avaloniaui #avalonia
#wpf #xaml #привязка данных #avaloniaui #avalonia
Вопрос:
Я новичок в Avalonia, и мне нужно сгенерировать список вопросов и ответов для одного из моих проектов. До сих пор я генерировал вопросы и ответы по мере необходимости. Код для XAML
<ItemsControl Items="{Binding Questions}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock
Classes="header"
Text="{Binding QuestionDescription}"
TextWrapping="Wrap" />
<ItemsControl Items="{Binding Answers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox x:Name="{Binding AId}" Content="{Binding Answer}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Теперь я хочу создать различные варианты ответа (Radiobutton или checkbox) в зависимости от AnswerType
значения, которое я получаю из Questions
списка. Вот моя модель вопроса
public class Question
{
public string QId { get; set; }
public string QuestionDescription { get; set; }
public List<Answers> Answers { get; set; }
public string AnswerType { get; set; }
}
public class Answers
{
public string AId { get; set; }
public string Answer { get; set; }
}
Пример данных
{
"QId": "Q1",
"QuectionDescription": "Quection01",
"Answers": [
{
"AId": "Q1A1",
"Answer": "Yes"
},
{
"AId": "Q1A2",
"Answer": "No"
}
],
"AnswerType": "RadioButton"
},
{
"QId": "Q2",
"QuectionDescription": "Quection02",
"Answers": [
{
"AId": "Q2A1",
"Answer": "Football"
},
{
"AId": "Q2A2",
"Answer": "Baseball"
}
],
"AnswerType": "CheckBox"
}
Ответ №1:
public class TemplateDictionaryConverter : Dictionary<string, IDataTemplate>, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string s)
return this[s];
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> throw new NotSupportedException();
}
<ItemsControl Items="{Binding Answers}">
<ItemsControl.ItemTemplate>
<Binding
Path="AnswerType">
<Binding.Converter>
<example:TemplateDictionaryConverter>
<DataTemplate x:Key="CheckBox">
<CheckBox Content="{Binding Answer}" />
</DataTemplate>
<DataTemplate x:Key="RadioButton">
<RadioButton Content="{Binding Answer}" />
</DataTemplate>
</example:TemplateDictionaryConverter>
</Binding.Converter>
</Binding>
</ItemsControl.ItemTemplate>
</ItemsControl>
Комментарии:
1. Это было то, чего я ожидал. Огромное спасибо! @kekekeks