Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 395

Binding двойной запрос свойства

06.04.2023, 20:22. Показов 563. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Привязал текстовое поле к публичному свойству:

C#
1
tbDestination.DataBindings.Add(new Binding("Text", vm, "DestinationFolder"));
C#
1
2
        private string _destinationFolder;
        public string DestinationFolder { get { return _destinationFolder; } set { _destinationFolder = value; OnPropertyChanged(); } }
При отладке обнаружил, что get {...} у DestinationFolder вызывается дважды, при изменениях в текстовом поле. Так и должно быть?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.04.2023, 20:22
Ответы с готовыми решениями:

Binding свойства
Нужно чтобы кнопка была неактивной, если не выбрана ни одна запись из ListBox'a. Пытался так, но ругается. Как лучше реализовать? ...

Не выходит правильно сделать binding свойства к значению переменной класса
Пишу приложение, которое во время работы добавляет данные в лист который использует свой DataTemplate. Нужно привязать ширину обьекта...

Binding. Изменение изображения кнопки в Content в зависимости от свойства IsEnabled
<Button Style="{StaticResource Button_Round}" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Padding="10,1" ...

12
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
07.04.2023, 09:38
Лучший ответ Сообщение было отмечено lonelyhunter как решение

Решение

Цитата Сообщение от lonelyhunter Посмотреть сообщение
Так и должно быть?
Типичная реализация метода set в свойстве, которое оповещает о своём изменении, предполагает проверку на равенство новому значению, чтобы не генерировать событие каждый раз:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public string DestinationFolder
{
    get { return _destinationFolder; }
    set
    {
        if (!object.Equals(_destinationFolder, value))
        {
            _destinationFolder = value;
            OnPropertyChanged();
        }
    }
}
2
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
07.04.2023, 09:59
Цитата Сообщение от John Prick Посмотреть сообщение
C#
1
if (!object.Equals(_destinationFolder, value))
Интересный момент, не видел такого... Я так всегда делаю
C#
1
if (value != _destinationFolder) { ... }
Хотя может внимания не обращал
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3427 / 2746 / 575
Регистрация: 04.09.2018
Сообщений: 8,620
Записей в блоге: 3
07.04.2023, 10:27
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Я так всегда делаю
А если таких свойств миллион? На все эти проверки ставить?
По моему проще в базовом классе один раз прописать и все...:
C#
1
2
3
4
5
6
7
    protected virtual bool Set<T>( ref T field, T value, [CallerMemberName] string PropertyName = null )
    {
        if ( Equals( field, value ) ) return false;
        field = value;
        OnPropertyChanged( PropertyName );
        return true;
    }
1
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
07.04.2023, 10:31
Цитата Сообщение от wizard41 Посмотреть сообщение
По моему проще в базовом классе один раз прописать и все
Ну это если нет другого базового )
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3427 / 2746 / 575
Регистрация: 04.09.2018
Сообщений: 8,620
Записей в блоге: 3
07.04.2023, 10:37
Цитата Сообщение от John Prick Посмотреть сообщение
Ну это если нет другого базового
Я имел в виду отнаследоваться от INPC, прописать в нем "свой" метод Set<T> с необходимой проверкой.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public class BaseModel : INotifyPropertyChanged
    {
        #region PropertyChangedEventHandler
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected virtual void OnPropertyChanged( [CallerMemberName] string PropertyName = null )
        {
            PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( PropertyName ) );
        }
        #endregion
 
        protected virtual bool Set<T>( ref T field, T value, [CallerMemberName] string PropertyName = null )
        {
            if ( Equals( field, value ) ) return false;
            field = value;
            OnPropertyChanged( PropertyName );
            return true;
        }
    }


Добавлено через 1 минуту
Тогда без лишних телодвижений установка свойств (пример):
C#
1
2
3
4
5
    public int BaudRate
    {
        get => baudRate;
        set => Set(ref baudRate, value);
    }
2
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
07.04.2023, 10:40
wizard41, Видел такое, но по моему минус будет в том, что под замену значения свойства не запишешь свою логику, если свойство прошло проверку, примерно вот так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public MDrawSummarySpec SelectedPosition
{
    get => _selectedPosition;
    set
    {
        if (value != _selectedPosition)
        {
            _selectedPosition = value;
            OnPropertyChanged(nameof(SelectedPosition));
 
            if (SelectedPosition != null)
            {
                _taskQueue.QueueBackgroundWorkItem(() => LoadStorageDataAsync());
            }
        }
    }
}
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3427 / 2746 / 575
Регистрация: 04.09.2018
Сообщений: 8,620
Записей в блоге: 3
07.04.2023, 10:44
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
что под замену значения свойства не запишешь свою логику, если свойство прошло проверку
Почему же?
C#
1
2
3
4
5
6
7
8
9
        public int BaudRate
        {
            get => baudRate;
            set
            {
                bool b = Set(ref baudRate, value);
                if(b) { }
            }
        }
Виртуальный Set возвращает bool...
Или я чего-то не понял. В любом случае, думаю несложно переделать под свои нужды, например перегрузив Set<>...
2
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
07.04.2023, 10:44
Цитата Сообщение от wizard41 Посмотреть сообщение
Я имел в виду отнаследоваться от INPC
Да я понял, это известная вещь. Просто корнем иерархии может быть какой-то другой класс, не реализующий INPC. И тогда уже придётся INPC реализовывать самому, по сути дублируя код.
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
07.04.2023, 10:46
Цитата Сообщение от wizard41 Посмотреть сообщение
Виртуальный Set возвращает bool...
Хмммм, а вот об этом я не подумал
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3427 / 2746 / 575
Регистрация: 04.09.2018
Сообщений: 8,620
Записей в блоге: 3
07.04.2023, 10:49
Цитата Сообщение от John Prick Посмотреть сообщение
Просто корнем иерархии может быть какой-то другой класс
Ну мы сейчас просто вытягиваем совсем другие случаи, которые напрямую не связаны с вопросом ТСа )).
Речь же идет о конкретной "двойной" установке свойства, которая элементарно решается приведенными методами.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
я не подумал
Утром кофе надо пить, а не бежать сразу к компу ))


0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
07.04.2023, 10:51
Цитата Сообщение от wizard41 Посмотреть сообщение
Утром кофе надо пить, а не бежать сразу к компу ))

Не по теме:

Я по совместительству, так что можно чего-то прошляпить


0
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 395
07.04.2023, 15:53  [ТС]
Спасибо всем присутствующим.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2023, 15:53
Помогаю со студенческими работами здесь

Является ли Binding команд на свойства статического класса нарушением MVVM?
Есть класс FileDropper в котом есть команды: public static class FileDropper { #region Properties public static ICommand...

Секреты Binding или как мне прибить свойство свойства в XAML
Всем привет! народ подскажите вот какую вещь... есть у меня класс Person, в этом классе есть переменная типа Department которая ссылается...

Binding свойства объекта в combobox к свойству другого объекта :)
Всем привет)) У меня есть WPF приложение на котором расположен ComboBox с объектами этого класа class IDbehindTitle { ...

Двойной запрос в Mysql C#
Почему у меня выводит ошибку Could not find specified column in results: t1.cat_category в звпросе MySqlConnection mcon = new...

Передать внутри Binding в ConverterParameter ссылку на окно содержащее объект, который использует Binding
В главном окне в ресурсах есть Контекстные меню. У программы есть &quot;Ручной режим&quot;, если режим тру. то подставить одно контекстное меню....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru