Привязка и паттерн Model-View-ViewModel

Введение в привязку. Форматирование значения привязки

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

Привязка данных позволяет связать два свойства разных объектов таким образом, что изменения свойства одного объекта автоматически приводили к изменению свойства другого объекта. Привязка данных состоит из двух компонентов:

  • источник привязки (source) - кто привязывается

  • цель привязки (target) - к кому идет привязка

  • Привязка осуществляется от свойства источника к свойству цели. И когда происходит изменение источника, механизм привязки автоматически обновляет также и цель.

    Для установки привязки в Windows Forms у класса Control, который является базовым для всех элементов управления в Windows Forms, определено свойство DataBindings. Это свойство представляет коллекцию ControlBindingsCollection, которая содержит все привязки.

    Каждая отдельная привязка представляет класс Binding. Для создания привязки класс Binding предоставляет ряд конструкторов. Рассмотрим самый простейший:

    Binding (string propertyName, object dataSource, string dataMember);

    Параметры

    • propertyName: представляет свойство текущего объекта в виде строки

    • dataSource: объект, к которому идет привязка

    • dataMember: представляет свойство объекта из параметра dataSource, к которому идет привязка

    Рассмотрим простейший пример. Пусть у нас создается следующая форма:

    namespace MetanitApp;
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    
            TextBox textBox1 = new TextBox();
            textBox1.Location = new Point(12, 12);
            textBox1.Size = new Size(250, 27);
            Controls.Add(textBox1);
    
            Label label1 = new Label();
            label1.Location = new Point(12, 60);
            label1.AutoSize = true;
            Controls.Add(label1);
    
            label1.DataBindings.Add(new Binding("Text", textBox1, "Text"));
        }
    }
    

    Здесь создаются и добавляются на форму два элемента управления - текстовое поле TextBox и метка Label. Причем текст метки привязан к тексту текстового поля:

    label1.DataBindings.Add(new Binding("Text", textBox1, "Text"));

    Здесь первый параметр конструктора Binding - "Text" представляет свойство Text текущего элемента label1, поскольку мы хотим привязать текст метки.

    Второй параметр - textBox1 - объект, к которому привязываемся, то есть текстовое поле.

    И третий параметр - "Text" - к какому именно свойству привязываемся. То есть привязка идет к свойству Text элемента textBox1

    В итоге при вводе текста в текстовое поле он сразу будет отображаться в метке.

    Привязка элементов управления в Windows Forms и C#

    Форматирование значений привязки

    Событие Format позволяет форматировать значение привязки. Это событие представляет делегат

    void ConvertEventHandler (object? sender, ConvertEventArgs e)

    Второй параметр - объект ConvertEventArgs предоставляет два свойства для отслеживания привязки:

    • DesiredType: тип данных

    • Value: значение, полученное от источника привязки

    Обрабатывая это событие мы можем выполнить форматирование:

    namespace MetanitApp;
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    
            TextBox textBox1 = new TextBox();
            textBox1.Location = new Point(12, 12);
            textBox1.Size = new Size(250, 27);
            Controls.Add(textBox1);
    
            Label label1 = new Label();
            label1.Location = new Point(12, 60);
            label1.AutoSize = true;
            Controls.Add(label1);
    
            Binding binding = new Binding("Text", textBox1, "Text");
            binding.Format += (sender, e) => e.Value = $"Content: {e.Value}";
    
            label1.DataBindings.Add(binding);
        }
    }
    

    В данном случае мы изменяем полученное значение и новую строку присваиваем свойству e.Value

    Форматирование значений привязки элементов управления в Windows Forms и C#

    Установка строки форматирования

    Если привязка идет к свойствам, которые представляют числа, даты и время, TimeSpan, перечисления, то класс Binding позволяет задать строку форматирования с помощью свойства FormatString. Например, пусть у нас метка привязана к элементу выбора даты и времени:

    namespace MetanitApp;
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    
            DateTimePicker dateTimePicker1 = new DateTimePicker();
            dateTimePicker1.Location = new Point(12, 12);
            dateTimePicker1.Size = new Size(250, 27);
            Controls.Add(dateTimePicker1);
    
            Label label1 = new Label();
            label1.Location = new Point(12, 60);
            label1.AutoSize = true;
            Controls.Add(label1);
    
            Binding binding = new Binding("Text", dateTimePicker1, "Value");
            label1.DataBindings.Add(binding);
        }
    }
    

    Здесь свойство Text метки привязано к свойству "Value" объекта dateTimePicker1. На данный момент никакого форматирования нет, поэтому метка отобразит полную дату и время:

    Форматирование значений привязки Binding в Windows Forms и C#

    Теперь применим форматирование:

    namespace MetanitApp;
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    
            DateTimePicker dateTimePicker1 = new DateTimePicker();
            dateTimePicker1.Location = new Point(12, 12);
            dateTimePicker1.Size = new Size(250, 27);
            Controls.Add(dateTimePicker1);
    
            Label label1 = new Label();
            label1.Location = new Point(12, 60);
            label1.AutoSize = true;
            Controls.Add(label1);
    
            // создаем объект привязки
            Binding binding = new Binding("Text", dateTimePicker1, "Value");
            // делаем доступным форматирование
            binding.FormattingEnabled= true;
            // строка форматирования
            binding.FormatString = "dd.MM.yyyy";
    
            label1.DataBindings.Add(binding);
        }
    }
    

    В качестве строки форматирования выступает "dd.MM.yyyy", которая предписывает вывести дату в формате "день.месяц.год"

    binding.FormatString = "dd.MM.yyyy";

    Но чтобы разрешить форматирование, свойству FormattingEnabled надо присвоить значение true (по умолчанию оно равно false)

    binding.FormattingEnabled= true;

    Результат форматирования:

    Форматирование значений привязки и свойства FormatString и FormattingEnabled в Windows Forms и C#
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850