Я создал шаблон, который подходит для системы, которая позволяет пользователю заполнить форму. Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что созданный мной шаблон использует выпадающий список, который позволяет пользователю выбирать int из списка, который извлекается из пользовательского атрибута в модели вопроса. (Я знаю, как ужасно это звучит, так что, вероятно, это будет легко показать с помощью примеров)
В двух фрагментах ниже показана таблица данных для типа выпадающего вопроса. Первый показывает, чего я надеюсь достичь с помощью источника элементов, который выбирает варианты выпадающего списка и позволяет сохранить их. Но это не работает - он показывает опции, которые выбираются при нажатии на запись, и затем они добавляются в поле. После сохранения страницы и повторного открытия предыдущий выбор возвращается к пустому.
Questions.xaml - раскрывающийся шаблон из источника элементов (не работает)
<DataTemplate x:Key="DropdownTemplate">
<StackLayout IsVisible="{Binding IsVisible}" HeightRequest="{Binding RowHeight}" Padding="{Binding IndentPadding}">
<StackLayout Orientation="Horizontal">
<Label Text="{Binding Text}" StyleClass="QuestionText"/>
<Picker SelectedItem="{Binding Answer, Converter={StaticResource DropDownConverter},Mode=TwoWay}" StyleClass="QuestionAnswer" WidthRequest="100" ItemsSource="{Binding DropdownOptions}"></Picker>
</StackLayout>
<BoxView StyleClass="ListBreak"/>
</StackLayout>
</DataTemplate>
Questions.xaml - раскрывающийся шаблон (работающий)
<DataTemplate x:Key="DropdownTemplate">
<StackLayout IsVisible="{Binding IsVisible}" HeightRequest="{Binding RowHeight}" Padding="{Binding IndentPadding}">
<StackLayout Orientation="Horizontal">
<Label Text="{Binding Text}" StyleClass="QuestionText"/>
<Picker SelectedItem="{Binding Answer, Converter={StaticResource DropDownConverter},Mode=TwoWay}" StyleClass="QuestionAnswer" WidthRequest="100" ItemsSource="{Binding DropdownOptions}">
<Picker.ItemsSource>
<x:Array Type="{x:Type x:Int32}">
<x:Int32>1</x:Int32>
<x:Int32>2</x:Int32>
</x:Array>
</Picker.ItemsSource>
</Picker>
</StackLayout>
<BoxView StyleClass="ListBreak"/>
</StackLayout>
</DataTemplate>
Из отладки Я вижу, что нажатие на эту опцию и сохранение работает, как и ожидалось, но после повторного открытия страницы, содержащей вновь сохраненную запись, значение корректно попадает в конвертер - преобразуется - и, кажется, завершилось и сработало, как и ожидалось. Затем преобразователь снова запускается, и поле «значение» становится пустым, что затем устанавливает запись равной нулю, изменяя предыдущий выбор. (Жестко закодированная версия правильно работает с доступом к конвертеру, как и ожидалось)
Выпадающий конвертер
public class DropDownConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
int final = Int32.Parse(value.ToString());
return final;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
string final = value.ToString();
return final;
}
return null;
}
}
Пример вопроса (из модели)
[QuestionAttribute(dropdownOptions = new List<int> ( 1, 2)]
[Display(Name = "QuestionName")]
public int? Question { get; set; }
QuestionAttribute
[AttributeUsage(AttributeTargets.Property)]
public class QuestionAttribute : Attribute
{
public int[] dropdownOptions { get; set; }
}
Извините, если что-то из этого не понятно, я буду рад ответить на дополнительные вопросы или предоставить изображения приложения, если это необходимо. Я довольно уверен, что проблема заключается в процессе получения источника данных из атрибута вопроса данного конкретного вопроса. Есть лучший способ сделать это? Должен ли он быть в списке?
Любая помощь очень ценится!