Построим приложение для просмотра и редактирования данных, описанных выше. Используем возможности привязки. В левой части окна разместим ListBox, установив его свойство DisplayMemberPath. Заполнение ListBox выполним в коде. В правой части окна расположим текстовые поля для редактирования выбранного элемента списка и кнопку для добавления элемента. Обратите внимание, как в разметке задана привязка к выбранному элементу списка.
<Window x:Class="WpfLists.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="220" Title="WPF Lists">
<StackPanel Orientation="Horizontal">
<ListBox Name="lst" DisplayMemberPath="Name" Width="200" />
<Grid Margin="5" Width="170"
DataContext="{Binding SelectedItem, ElementName=lst}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="7" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="11" />
<RowDefinition Height="Auto" />
<RowDefinition Height="11" />
<RowDefinition Height="25" />
|
|
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Name" />
<TextBox Grid.Row="0" Grid.Column="2"
Text="{Binding Name, Mode=TwoWay,
ValidatesOnDataErrors=True}" />
<TextBlock Grid.Row="2" Grid.Column="0" Text="Age" />
<TextBox Grid.Row="2" Grid.Column="2"
Text="{Binding Age, Mode=TwoWay,
ValidatesOnDataErrors=True}" />
<Button Grid.Row="4" Grid.Column="2" Content="Add"
Click="Button_Click" />
</Grid>
</StackPanel>
</Window>
// класс окна
public partial class MainWindow: Window
{
private readonly List<Person> src;
public MainWindow()
{
InitializeComponent();
src = Repository.ReadAll();
lst.ItemsSource = src;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
src.Add(new Person {Name = "Morpheus", Age = 38});
}
}
Запуск приложения выявляет следующий недостаток – ListBox не обновляет свой внешний вид при добавлении элемента. Чтобы включить отслеживание изменений, нужно в качестве источника данных использовать коллекцию с интерфейсом INotifyCollectionChanged. Существует единственная стандартная коллекция, реализующая этот интерфейс – ObservableCollection<T>.
// переписанный фрагмент конструктора
// тип поля src также нужно изменить
src = new ObservableCollection<Person>(Repository.ReadAll());
Рис. 47. Просмотр и редактирование коллекции.