Нужна помощь в разработке приложения на WPF
Есть проблема, которую я не могу решить долгий период времени, она заключается в том, что я разрабатываю динамический конструктор тестов. Конструктор должен иметь возможность давать пользователю создавать неограниченное количество вопросов с одним вариантов ответа: множеством вариантов и текстовым ответом, без ограничения количества вариантов ответа в одном вопросе. То есть пользователь будет динамически создавать и изменять объекты через интерфейс, соответственно мне необходимо чтобы работала привязка TwoWay. Я нашел только одно решение спустя множество, экспериментов которое работает, но мне не нравиться как оно реализовано. Были созданы 3 класса представляющие собой варианты ответов CheckBoxItem, RadioButtomItem и TextItem, также они были унаследованы от интерфейса IItem позже объясню почему Пример одного из классов:
[Serializable]
public class CheckBoxItem : IItem
{
private string text;
public string Text
{
get => text;
set => text = value;
}
private bool correctAnswer = false;
public bool CorrectAnswer
{
get => correctAnswer;
set => correctAnswer = value;
}
public bool Compare(object obj)
{
if (obj is CheckBoxItem cb)
{
if (correctAnswer == cb.correctAnswer)
return false;
}
return true;
}
}
Для составления самого вопроса был создан класс Question
[Serializable]
public class Question
{
private string questionName;
public string QuestionName
{
get => questionName;
set => questionName = value;
}
public ObservableCollection<IItem> Items { get; set; }
= new ObservableCollection<IItem>();
}
В коллекцию будут помещаться CheckBoxItem, RadioButtomItem и TextItem в зависимости от типа вопроса.
В ViewModels самого конструктора используеться следующий код:
internal class Create_LoadWindowViewModel : ViewModel, ICloseWindows
{
IFileService fileService;
DialogService dialogService;
bool editTest;
Test test;
public bool CanClose()
{
return true;
}
public Action Close{ get; set; } = () => { MessageBox.Show("Save test?"); };
public ObservableCollection<Question> Questions { get; set; }
= new ObservableCollection<Question>();
private Question selectedQuestion = new Question();
public Question SelectedQuestion
{
get => selectedQuestion;
set
{
Set(ref selectedQuestion, value);
}
}
private IItem selectedItem;
public IItem SelectedItem
{
get => selectedItem;
set
{
Set(ref selectedItem, value);
}
}
public string testName;
public string TestName
{
get => testName;
set
{
Set(ref testName, value);
}
}
COMMANND
methods
public Create_LoadWindowViewModel(DialogService dialogService, IFileService fileService, Test test, bool editTest)
{
this.dialogService = dialogService;
this.fileService = fileService;
Questions = test.Questions;
TestName = test.Name;
this.test = test;
this.editTest = editTest;
}
}
Минус данного подхода заключается в том, что мне доступен только BinaryFormatter так, как только он может сериализовать интерфейс используемы в классе Question как тип коллекции, json и XML сериализации выдают ошибку.
Я пробивал заменить класс Question на Question<T> что приводит к большему количеству проблем также были попытки сократить класс Question использую кортежи но тогда нельзя динамически изменять объекты через пользовательский интерфейс.
Подробнее можно ознакомиться на https://github.com/Kowari1/TestBuilder
Хочется узнать каким образом вы бы реализовали данную задачу