Как настроить SelectedItem

Рейтинг: 0Ответов: 0Опубликовано: 01.07.2023

Приложение представляет собой конструктор тестов, данное окно находиться только на начальной стадии разработки в тестовом решении. Проблема заключается в том что при создании нескольких вопросов, их можно выбрать мышкой, затем выбрать редактируемый элемент и изменить его например поле Text в классе CheckedItem, тогда все будет работать корректно и элемент в коллекции измениться, но если выбрать в другом вопросе его элемент не кликнув сначала на сам вопрос и после на его элемент и изменить его, изменения не будут учтены, так как не изменилось поле private Question selectedControlQuestion в классе MainWindowViewModel, изменить его в классе Question не представляется возможным. Данный функционал нужен для редактирования определенных элементов в приложении пользователем. Я только недавно начал изучать wpf, поэтому мог выбрать неправильный подход для выполнения данной задачи.

введите сюда описание изображения

<Window.Resources>
        <DataTemplate x:Key="CheckedItemSelector" >
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding CorrectAnswer, UpdateSourceTrigger=PropertyChanged}"/>
                <TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"/>
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="TextItemSelector">
            <StackPanel Orientation="Horizontal">
                <TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"/>
            </StackPanel>
        </DataTemplate>
        
        <vm:QuestionsDataTemplateSelector x:Key="myDataTemplateSelector"/>
    </Window.Resources>
    <Window.DataContext>
        <vm:MainWindowViewModel/>
    </Window.DataContext>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <StackPanel Grid.Column="1">
            <ListBox ItemsSource="{Binding interfaceElements}" SelectedItem="{Binding 
                SelectedControlQuestion}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBox Text="{Binding NameQuestion, UpdateSourceTrigger=PropertyChanged}"/>
                            <ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedControlItem}" 
                                     ItemTemplateSelector="{StaticResource myDataTemplateSelector}">
                            </ListBox>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </StackPanel>
        <Button x:Name="Create" Content="Создать вопрос" Width="150" 
                Height="50" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10"
                Command ="{Binding CreateQuestion}"/>
        <Button x:Name="CreateText" Content="Добавить текстовое поле" Width="150" 
                Height="50" VerticalAlignment="Top" HorizontalAlignment="Right" Margin="10"
                Command ="{Binding CreateText}"/>
        <Button x:Name="CreateCheck" Content="Добавить CheckBox" Width="150" 
                Height="50" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="10"
                Command ="{Binding CreateChekc}"/>
    </Grid>`введите сюда код`
public class MainWindowViewModel : ViewModel
    {
        public ObservableCollection<Question> interfaceElements { get; set; }
        = new ObservableCollection<Question>();

        private Question selectedControlQuestion;
        public Question SelectedControlQuestion
        {
            get { return selectedControlQuestion; }
            set
            {
                selectedControlQuestion = value;
                OnPropertyChanged("SelectedControlQuestion");
            }
        }

        public ICommand CreateQuestion { get; }
        private void OnCreateQuestionExecuted(object parameters)
        {
            var question = new Question() { NameQuestion = "Введите заголовок ответа"};
            interfaceElements.Add(question);
            SelectedControlQuestion = question;
        }
        private bool CanCreateQuestionExecuted(object parameter) => true;

        public ICommand CreateText { get; }
        private void OnCreateTextExecuted(object parameters)
        {
        var question = new TextItem() { Text = "Введите ответ" };
            selectedControlQuestion.Items.Add(question);
        }
        private bool CanCreateTextExecuted(object parameter) => true;

        public ICommand CreateChekc { get; }
        private void OnCreateChekcExecuted(object parameters)
        {
            var question = new CheckedItem() { Text = "Введите вопрос" };
            selectedControlQuestion.Items.Add(question);
        }
        private bool CanCreateChekcExecuted(object parameter) => true;

        public MainWindowViewModel()
        {
            CreateQuestion = new LambdaCommand(OnCreateQuestionExecuted, CanCreateQuestionExecuted);
            CreateText = new LambdaCommand(OnCreateTextExecuted, CanCreateTextExecuted);
            CreateChekc = new LambdaCommand(OnCreateChekcExecuted, CanCreateChekcExecuted);
        }
public class Question : ViewModel
    {
        private string nameQuestion;
        public string NameQuestion
        {
            get { return nameQuestion; }
            set
            {
                nameQuestion = value;
                OnPropertyChanged("NameQuestion");
            }
        }

        private IQuestionItem selectedControlItem;
        public IQuestionItem SelectedControlItem
        {
            get { return selectedControlItem; }
            set
            {
                selectedControlItem = value;
                OnPropertyChanged("SelectedControlItem");
            }
        }

        public ObservableCollection<IQuestionItem> Items { get; set; }
        = new ObservableCollection<IQuestionItem>();
    }
public class CheckedItem : ViewModel, IQuestionItem
    {
        private string text;
        public string Text
        {
            get { return text; }
            set
            {
                text = value;
                OnPropertyChanged("Text");
            }
        }

        private bool correctAnswer = false;
        public bool CorrectAnswer
        {
            get { return correctAnswer; }
            set
            {
                correctAnswer = value;
                OnPropertyChanged("CorrectAnswer");
            }
        }
    }
public class TextItem : ViewModel, IQuestionItem
    {
        private string text;
        public string Text
        {
            get { return text; }
            set
            {
                text = value;
                OnPropertyChanged("Text");
            }
        }
    }

Ответы

Ответов пока нет.