Как настроить SelectedItem
Приложение представляет собой конструктор тестов, данное окно находиться только на начальной стадии разработки в тестовом решении. Проблема заключается в том что при создании нескольких вопросов, их можно выбрать мышкой, затем выбрать редактируемый элемент и изменить его например поле 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");
}
}
}