Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

Установите свойство

DataContext
в свойство
SelectedItem
элемента
ComboBox
. Модифицируйте определение элемента
Grid
, содержащего элементы управления с информацией об автомобиле, следующим образом:

<Grid Grid.Row="1" Name="DetailsGrid"

DataContext="{Binding ElementName=cboCars, Path=SelectedItem}">

Текстовые поля в элементе

DetailsGrid
будут отображать индивидуальные характеристики выбранного автомобиля. Добавьте подходящие
атрибуты
Text
и привязки к элементам управления
TextBox
:

<TextBox Grid.Column="1" Grid.Row="0" Text="{Binding Path=Id}" />

<TextBox Grid.Column="1" Grid.Row="1" Text="{Binding Path=Make}" />

<TextBox Grid.Column="1" Grid.Row="2" Text="{Binding Path=Color}" />

<TextBox Grid.Column="1" Grid.Row="3" Text="{Binding Path=PetName}" />

Наконец, поместите нужные данные в элемент управления

ComboBox
. В файле
MainWindow.xaml.cs
создайте новый список записей
Car
и присвойте его свойству
ItemsSource
элемента
ComboBox
. Кроме того, добавьте оператор
using
для пространства имен
WpfNotifications.Models
.

using WpfNotifications.Models;

// Для краткости код не показан.

public partial class MainWindow : Window

{

readonly IList<Car> _cars = new List<Car>;

public MainWindow

{

InitializeComponent;

_cars.Add(new Car {Id = 1, Color = "Blue", Make = "Chevy",

PetName = "Kit"});

_cars.Add(new Car {Id = 2, Color = "Red", Make = "Ford",

PetName = "Red Rider"});

cboCars.ItemsSource = _cars;

}

}

Запустите приложение. Вы увидите, что в поле со списком Vehicle для выбора доступны два варианта автомобилей. Выбор одного из них приводит к автоматическому заполнению текстовых полей сведениями об автомобиле. Измените цвет одного из автомобилей, выберите другой автомобиль и затем возвратитесь к автомобилю, запись о котором редактировалась. Вы обнаружите, что новый цвет по-прежнему связан с автомобилем. Здесь нет ничего примечательного, просто демонстрируется мощь привязки данных XAML.

Изменение данных об автомобиле в коде

Несмотря на то что предыдущий пример работает ожидаемым образом, когда данные изменяются программно, пользовательский интерфейс не отразит изменения до тех пор, пока в приложении не будет предусмотрен код для обновления данных. Чтобы проиллюстрировать сказанное, добавьте обработчик события

Click
для кнопки
btnChangeColor
:

Button x:Name="btnChangeColor" Content="Change Color" Margin="5,0,5,0"

Padding="4, 2" Click="BtnChangeColor_OnClick"/>

Внутри обработчика события

BtnChangeColor_OnClick
с помощью
свойства
SelectedItem
элемента управления
ComboBox
отыщите выбранную запись в списке автомобилей и измените ее цвет на
Pink
:

private void BtnChangeColor_OnClick(object sender, RoutedEventArgs e)

{

_cars.First(x => x.Id == ((Car)cboCars.SelectedItem)?.Id).Color = "Pink";

}

Запустите приложение, выберите автомобиль и щелкните на кнопке Change Color (Изменить цвет). Никаких видимых изменений не произойдет. Выберите другой автомобиль и затем снова первоначальный. Теперь вы заметите обновленное значение. Для пользователя такое поведение не особенно подходит.

Добавьте обработчик события

Click
для кнопки
btnAddCar
:

<Button x:Name="btnAddCar" Content="Add Car" Margin="5,0,5,0" Padding="4, 2"

Click="BtnAddCar_OnClick" />

В обработчике события

BtnAddCar_OnClick
добавьте новую запись в список
Car
:

private void BtnAddCar_Click(object sender, RoutedEventArgs e)

{

var maxCount = _cars?.Max(x => x.Id) ?? 0;

_cars?.Add(new Car { Id=++maxCount,Color="Yellow",Make="VW",PetName="Birdie"});

}

Запустите приложение, щелкните на кнопке Add Car (Добавить автомобиль) и просмотрите содержимое элемента управления

ComboBox
. Хотя известно, что в списке имеется три автомобиля, в элементе
ComboBox
отображаются только два! Чтобы устранить обе проблемы, вы превратите класс
Car
в наблюдаемую модель и будете использовать наблюдаемую коллекцию для хранения всех экземпляров
Car
.

Наблюдаемые модели

Проблема с тем, что изменение значения свойства модели не отображается в пользовательском интерфейсе, решается за счет реализации классом модели

Car
интерфейса
INotifyPropertyChanged
. Интерфейс
INotifyPropertyChanged
содержит единственное событие
PropertyChangedEvent
. Механизм привязки XAML прослушивает это событие для каждого привязанного свойства в классах, реализующих интерфейс
INotifyPropertyChanged
. Вот как определен интерфейс
INotifyPropertyChanged
:

public interface INotifyPropertyChanged

{

event PropertyChangedEventHandler PropertyChanged;

}

Добавьте в файл

Car.cs
следующие операторы
using
:

using System.ComponentModel;

using System.Runtime.CompilerServices;

Затем обеспечьте реализацию классом

Car
интерфейса
INotifyPropertyChanged
:

Поделиться:
Популярные книги

Восход. Солнцев. Книга X

Скабер Артемий
10. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга X

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7

Неудержимый. Книга XIV

Боярский Андрей
14. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIV

Все не случайно

Юнина Наталья
Любовные романы:
современные любовные романы
7.10
рейтинг книги
Все не случайно

Гром над Тверью

Машуков Тимур
1. Гром над миром
Фантастика:
боевая фантастика
5.89
рейтинг книги
Гром над Тверью

Идущий в тени 5

Амврелий Марк
5. Идущий в тени
Фантастика:
фэнтези
рпг
5.50
рейтинг книги
Идущий в тени 5

Кровь, золото и помидоры

Распопов Дмитрий Викторович
4. Венецианский купец
Фантастика:
альтернативная история
5.40
рейтинг книги
Кровь, золото и помидоры

Неудержимый. Книга VIII

Боярский Андрей
8. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
6.00
рейтинг книги
Неудержимый. Книга VIII

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Пистоль и шпага

Дроздов Анатолий Федорович
2. Штуцер и тесак
Фантастика:
альтернативная история
8.28
рейтинг книги
Пистоль и шпага

Мастер 4

Чащин Валерий
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Мастер 4

Темный Патриарх Светлого Рода 6

Лисицин Евгений
6. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 6

Лорд Системы 14

Токсик Саша
14. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 14

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни