Как вы описали проблему, кажется, что вы не продумали это до конца.
Если у вас есть один список и набор элементов управления, которые отображают свойства выбранного элемента, где вы хотите свойстводанные для отображения при выборе нескольких элементов?Например, если у вас есть класс Person
, например:
public class Person
{
public string Name { get; set; }
public string City { get; set; }
public int Age { get; set; }
}
Когда пользователь выбирает из списка два разных экземпляра Person
, вы хотите, чтобы текстовое поле, назначенное свойству Name
, отображалосьвсе выбранные имена?Если нет, то если вы хотите, чтобы они были в разных текстовых полях, вам пришлось бы динамически создавать столько текстовых полей, сколько элементов было выбрано пользователем.Любое из которых, я чувствую, не может быть идеальным решением.
Вот альтернативное решение;вы отображаете свои данные в DataGrid
.Я использовал самый простой DataGrid
здесь с включенным AutoGeneratingColumns
.
<DataGrid Grid.Row="0" Margin="4"
Name="DataGridPersons"
AutoGenerateColumns="True"
ItemsSource="{Binding Persons}"/>
Затем, в вашем Code Behind (в идеале вы должны использовать MVVM
скороговорку и в этом случае в вашем ViewModel
) вы просто заполняете свой список данных.
public ObservableCollection<Person> Persons { get; set; }
public MainWindow()
{
InitializeComponent();
Persons = new ObservableCollection<Person>
{
new Person() { Name = "Jane", City = "NY", Age = 23 },
new Person() { Name = "Chelsea", City = "LA", Age = 27 },
new Person() { Name = "Chris", City = "Chicago", Age = 25 }
};
DataContext = this;
}
По умолчанию DataGrid
является редактируемым и записывает сделанные вами изменения.
Редактируемый DataGrid
:
РЕДАКТИРОВАТЬ:
После отредактированного вопроса ОП это новый ответ.
В этом случае я бы избавился от SelectedItem
и вместо этого имел бы различные свойства string
, соответствующие каждому свойству в вашем объекте класса.
Предположим, ваш класс Person
таков:
public class Person
{
public string Name { get; set; }
public string City { get; set; }
}
Тогда у меня будет ObservableCollection
и столько же string
свойств, сколько у вас есть свойств в вашем классе;два в этом случае.
public ObservableCollection<Person> Persons { get; set; }
private string _editName = null;
public string EditName
{
get { return _editName; }
set
{
_editName = value;
OnPropertyChanged("EditName");
}
}
private string _editCity = null;
public string EditCity
{
get { return _editCity; }
set
{
_editCity = value;
OnPropertyChanged("EditCity");
}
}
Затем я бы привязал текстовые поля к этим свойствам:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ListBox Grid.Column="0" Grid.Row="0" Grid.RowSpan="3"
Margin="8" Name="ItemListBox"
ItemsSource="{Binding Persons}"
DisplayMemberPath="Name"/>
<TextBox Grid.Column="1" Grid.Row="0"
Margin="8" Name="TxtName"
TextChanged="TxtName_TextChanged"
Text="{Binding EditName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Grid.Column="1" Grid.Row="1"
Margin="8" Name="TxtCity"
TextChanged="TxtCity_TextChanged"
Text="{Binding EditCity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
И в событии TextChanged
каждого текстового поля я бы обновилваш ObservableCollection
.
private void TxtName_TextChanged(object sender, TextChangedEventArgs e)
{
foreach (var person in Persons)
{
person.Name = EditName;
}
}
private void TxtCity_TextChanged(object sender, TextChangedEventArgs e)
{
foreach (var person in Persons)
{
person.City = EditCity;
}
}