Нужна помощь в разработке приложения на 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 Хочется узнать каким образом вы бы реализовали данную задачу


Ответы (0 шт):