DataContext

Последнее обновление: 29.01.2023

Начиная с версии .NET 7 в класс Control, от которого наследуются все остальные классы элементов управления в Windows Forms, было добавлено свойство DataContext. Это свойство предназначено для установки контекста данных или источника данных для элемента. Данное свойство представляет тип object, соответственно ему можно передать любой объект. Например,

namespace MetanitApp;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        Person person = new Person { Name = "Tom", Age = 18 };
 
        Label label1 = new Label();
        label1.Location = new Point(12, 10);
        label1.AutoSize = true;
        Controls.Add(label1);

        Label label2 = new Label();
        label2.Location = new Point(12, 50);
        label2.AutoSize = true;
        Controls.Add(label2);

        this.DataContext= person;   // устанавливаем контекст данных для всей формы

        // привязка меток Label к контексту страницы
        label1.DataBindings.Add(new Binding("Text", this.DataContext, "Name"));
        label2.DataBindings.Add(new Binding("Text", this.DataContext, "Age"));
    }
}
public class Person
{
    public string Name { get; set; } = "";
    public int Age { get; set; }
}

Здесь в качестве контекста формы выступает объект Person:

this.DataContext= person;

Далее мы сможем использовать этот контекст для установки привязок:

label1.DataBindings.Add(new Binding("Text", this.DataContext, "Name"));
label2.DataBindings.Add(new Binding("Text", this.DataContext, "Age"));

В данном случае в качестве цели привязки обе метки привязываются к свойствам Name и Age контекста формы - DataContext, а через него фактически - объекта Person.

Свойство DataContext в Windows Forms и C#

Стоит отметить, что по умолчанию значение этого свойства переходит и всем вложенным элементам. Так, в примере выше форма содержит две метки Label. У класса Label, как и у других элементов управления, есть свойство DataContext. И в данном случае оно также будет содержать ранее определенный объект Person. Соответственно мы могли бы также прописать установку привязок следующим образом:

label1.DataBindings.Add(new Binding("Text", label1.DataContext, "Name"));
label2.DataBindings.Add(new Binding("Text", label2.DataContext, "Age"));

Результат был бы тот же самый.

Таким образом, благодаря свойству DataContext мы можем в одном месте установить данные для всего контейнера (например, формы) и его компонентов.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850