Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376

Как поднять RaisepropertyChanged отдельного свойства извне?

24.09.2020, 18:09. Показов 8404. Ответов 100
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Вот такого вида свойство.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public const string Property1PropertyName = "Property1";
 
        private bool _property1 = false;    
        public bool Property1
        {
            get
            {
                return _property1;
            }
 
            set
            {
                if (_property1 == value)
                {
                    return;
                }
 
                _property1 = value;
                RaisePropertyChanged(Property1PropertyName);
            }
        }
Каким образом можно поднять его RaisePropertyChanged извне?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.09.2020, 18:09
Ответы с готовыми решениями:

Как изменить свойства ComboBox из отдельного потока
Ребята! Привет! Вопрос такой: есть форма с комбобоксами и текстбоксами, когда я ввожу туда данные, они передаются в процедуру которая...

Какие общие правила для написания отдельного класса/файла с условием/заданием и отдельного класса с методом решен?
Например: условие задания: public class Main { public static void main(String args) { int source = {1, 2, 3, 4, 5, 6, 7, 8,...

PropertyGrid. Как отловить видимость свойства в зависимости от другого свойства?
Работаю с propertyGrid. Одно поле высвечивается, когда в другом появляется определенное значение. Взяла за основу раздел «Как управлять...

100
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
28.09.2020, 13:00
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Berendom Посмотреть сообщение
Да и не работает это.
Сейчас сам переименую и скину архив.

Цитата Сообщение от Berendom Посмотреть сообщение
а каким образом связано исполнение метода update что DialogWindowViewModel с исполнением метода Load?
Надо как-то связать разные объект (создать зависимости).
В данном случае, при создании DialogWindowViewModel в конструктор передаётся делегат метода Load(), этот делегат запоминается в поле this.update = update ?? throw new ArgumentNullException();.
Для вызова метода по ссылке в делегате надо обратиться к этому полю как к методу update()
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
28.09.2020, 13:19
Цитата Сообщение от Berendom Посмотреть сообщение
не работает это.
Вот архив: RaisePropertyChanged(Berendom1).7z
1
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
28.09.2020, 13:41  [ТС]
В debugging,
-если смена фокуса на TextBox приводит программу к методу Load. Так и должно быть.
-в Диалоге, нажатие кнопки "Да" ни к чему не приводит.

Добавлено через 31 секунду
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вот архив: RaisePropertyChanged(Berendom1).7z
сейчас посмотрю.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
28.09.2020, 14:35
Цитата Сообщение от Berendom Посмотреть сообщение
-в Диалоге, нажатие кнопки "Да" ни к чему не приводит.
Там в XAML не было привязки команды.
1
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
28.09.2020, 15:16  [ТС]
Элд Хасп,

Как с этим? Нельзя оставить без изменений.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        //Property
        public const string SelectedItemPropertyName = "SelectedItem";
 
        private int? _selectedItem;
 
        public int? SelectedItem
        {
            get
            {
                return _selectedItem;
            }
 
            set
            {
                if (_selectedItem == value)
                {
                    return;
                }
 
                _selectedItem = value;
                RaisePropertyChanged(SelectedItemPropertyName);
                Load(value ?? -1);
            }
        }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.09.2020, 10:25
Цитата Сообщение от Berendom Посмотреть сообщение
Как с этим? Нельзя оставить без изменений.
Если очень треба - можно.
Тогда уберите переопределение метода RaisePropertyChanged.
Должно быть одно из двух или вызов в теле свойство, или в RaisePropertyChanged.

Но для себя знайте, в реальных своих задачах так никогда не делайте.
Свойства должны определяться таким образом
C#
18
19
20
21
22
23
24
        private int? _selectedItem;
 
        public int? SelectedItem
        {
            get => _selectedItem;
            set => Set(ref _selectedItem, value);
        }
Аналогичные методу Set(ref ..., value) методы есть в любом фрамеворке.
Даже в моей простой учебной реализации для этого форума: Новая реализация OnPropertyChangedClass [WPF, Элд Хасп].

Добавлено через 5 минут
И надо добавить перегрузку для метода Load
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.CommandWpf;
using System.Runtime.CompilerServices;
 
namespace RaisePropertyChanged
{
    public class ViewModel : ViewModelBase
    {
 
 
        //Property
        public const string SelectedItemPropertyName = "SelectedItem";
 
        private int? _selectedItem;
 
        public int? SelectedItem
        {
            get
            {
                return _selectedItem;
            }
 
            set
            {
                if (_selectedItem == value)
                {
                    return;
                }
 
                _selectedItem = value;
                RaisePropertyChanged(SelectedItemPropertyName);
                Load(value ?? -1);
            }
        }
 
        // Method
        private void Load(int number)
        {
            // нужна возможность стороннего исполнения из другой VM, но чтобы через метод проходил параметр
            // в данный момент вписаный в Property
 
        }
 
        // Перегрузка для передачи делегата
        private void Load() => Load(SelectedItem ?? -1);
 
 
        // Command 
        private RelayCommand _callDialog;
        public RelayCommand CallDialog => _callDialog
                    ?? (_callDialog = new RelayCommand(ExecuteCallDialog));
 
        // Commands method
        private void ExecuteCallDialog()
        {
            var vm = new DialogWindowViewModel(Load);
 
            var _dialogWindow = new DialogWindow() { DataContext = vm };
            _dialogWindow.ShowDialog();
        }
    }
}
1
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
29.09.2020, 12:04  [ТС]
Элд Хасп,

C#
1
2
3
4
5
6
public override void RaisePropertyChanged<T>([CallerMemberName] string propertyName = null, T oldValue = default, T newValue = default, bool broadcast = false)
        {
            base.RaisePropertyChanged(propertyName, oldValue, newValue, broadcast);
            if (propertyName == nameof(SelectedItem))
            Load();
        }
Вот эта штука в старых версиях Visual Studio не определяется.

oldvalue, newvalue -
A value of type '?' cannot be used as a default parameter because there are no standard conversions to type 'T'
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.09.2020, 14:42
Цитата Сообщение от Berendom Посмотреть сообщение
Вот эта штука в старых версиях Visual Studio не определяется.
Удалите этот метод.
потом в теле класса на пустой строке выберите "Быстрые Решения".
В них "Создать переопределения".
В Окне выберите метод RaisePropertyChanged(string....
Посмотрите в каком синтаксисе будет вставлен этот метод.

Возможно для вашей версии нудно не просто default а с параметром T oldValue = default<T>, T newValue = default<T>,
1
10 / 10 / 1
Регистрация: 10.09.2019
Сообщений: 232
29.09.2020, 17:33
Элд Хасп,


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 public class ViewModel : ViewModelBase
    {
 
 
        //Property
        public const string SelectedItemPropertyName = "SelectedItem";
 
        private int? _selectedItem;
 
        public int? SelectedItem
        {
            get
            {
                return _selectedItem;
            }
 
            set
            {
                if (_selectedItem == value)
                {
                    return;
                }
 
                _selectedItem = value;
                RaisePropertyChanged(SelectedItemPropertyName);
                Load(value ?? -1);
            }
        }
 
        // Method
        private void Load(int number)
        {
            // нужна возможность стороннего исполнения из другой VM, но чтобы через метод проходил параметр
            // в данный момент вписаный в Property
 
        }
 
        // Перегрузка для передачи делегата
        private void Load() => Load(SelectedItem ?? -1);
 
 }


В таком виде на одном компе значение параметра что при смене фокуса в TextBox,
что при нажатии кнопки "Да" в диалоге -проходит. Смотрел в дебаге, значение на месте.

На ноуте код тот же и первая часть кода=ОК, но при нажатии кнопки "Да" в диалоге, программа заходит в тело метода, но значение имеет "-1".
То есть в свойстве срабатывает проверка Load(value ?? -1);
Разве такое бывает? Шаги в дебаге идентичные, во второй программе код "на лево" не ходит.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.09.2020, 21:26
Цитата Сообщение от кружок-ДДТ Посмотреть сообщение
рограмма заходит в тело метода, но значение имеет "-1".
То есть в свойстве срабатывает проверка Load(value ?? -1);
Вы неправильно интерпретировали.
По кнопке может быть вызвана только перегрузка Load().
И раз выводится значение -1, значит в этот момент SelectedItem=null.
Для идентификации проблемы, задайте в XAML ещё один отладочный TextBlock привязанный к SelectedItem.
По нему вы будете в реальном времени видеть значение свойства.

Я думаю, скорее всего, проблема в отсутствии UpdateSourceTrigger=PropertyChanged в привязке TextBox.
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
29.09.2020, 22:16  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для идентификации проблемы, задайте в XAML ещё один отладочный TextBlock привязанный к SelectedItem.
ввожу например "2", второй TextBlock привязанный к SelectedItem, даже не моргнет во время манипуляций, постоянно
показывает "2".

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я думаю, скорее всего, проблема в отсутствии UpdateSourceTrigger=PropertyChanged в привязке TextBox.
Это сразу же попробовал. Не оно.

Тут почему-то связь между свойством и методом теряется.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.09.2020, 22:24
Лучший ответ Сообщение было отмечено Berendom как решение

Решение

Цитата Сообщение от Berendom Посмотреть сообщение
Тут почему-то связь между свойством и методом теряется.
Она ни как потеряться не может.
А вот нарушится связь TextBox со свойством может.

Добавлено через 1 минуту
Цитата Сообщение от Berendom Посмотреть сообщение
ввожу например "2", второй TextBlock привязанный к SelectedItem, даже не моргнет во время манипуляций, постоянно
показывает "2".
Не понял....
Причём здесь "моргнёт", если там и так "2".

Можете видео сделать и показать что не так?
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
29.09.2020, 22:40  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Можете видео сделать и показать что не так?
уже нашел баг в дебаге.
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
30.09.2020, 14:41  [ТС]
Элд Хасп,

не интересно в чем проблема была?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
30.09.2020, 17:25
Цитата Сообщение от Berendom Посмотреть сообщение
не интересно в чем проблема была?
Конечно, напишите.

Добавлено через 25 секунд
И рабочий код выложите.
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
30.09.2020, 19:28  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И рабочий код выложите.
не стоит эта нубская проблемка этого...

Цитата Сообщение от Berendom Посмотреть сообщение
Тут почему-то связь между свойством и методом теряется.

Связь терялась. Редиска Nguen, в своей версии сделал исполнение метода Load чуть по другому это то и прерывало связь между свойством и методом. И вынес мне мозг, помоги, что-то не так. Код тот-же...
А именно: он сделал экземпляр VM и вызывал метод.
Увы, мораль сей басни такова "если хочешь не потерять параметр вызывай метод там же где и свойство".
Как только я сделал как у себя. Т.е. метод вызывается в VM через Messenger, а свойство "лежит" рядом.
Параметр не теряется.

Т.е. "выдирая " метод в экземпляр мы отрываем его от свойства.
1
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
16.10.2020, 21:49  [ТС]
Элд Хасп,

возвращаясь назад, как все-таки сделать красиво? Запустить метод Load из другого класса по Сommand или событию кнопки.
Но чтобы число сидящее в свойстве все-таки передалось в тело.




C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 class MainWindowViewModel : ViewModelBase
    {
 
        // свойство
        public const string SelectedItemPropertyName = "SelectedItem";
 
        private long? _selectedItem;
 
        public long? SelectedItem
        {
            get
            {
                return _selectedItem;
            }
            set
            {
                Set(SelectedItemPropertyName, ref _selectedItem, value);
                Load(value ?? -1);
            }
        }
 
 
        //метод берет из свойства число и передает его далее в свое тело 
        public void Load(long? number)
        {
             // здесь используется это число
        }
 
    }
 
 
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
16.10.2020, 23:43
Цитата Сообщение от Berendom Посмотреть сообщение
как все-таки сделать красиво?
"Красиво" - зависит от функции возложенной на этот метод.

Рамочно мы можем определить несколько уровней функционала.

Один - это подгрузка каких данных для View из ViewModel и не влияющая ни на Данные в Model, ни на их состояние ViewModel.
В таком случае, реализацию этого метода лучше сделать в View.
В том числе можно использовать клик.


В другом - в методе происходит изменение состояния ViewModel.
Click и VM находятся в разных уровнях абстракции, но View может обращаться к членам VM.
Здесь надо смотреть несколько глубже - требуется ли методу Load какое-то взаимодействие с разными VM и должны ли быть "знания" об этом у View.

И последний уровень - Load (в конечном итоге) влияет на данные Модели.
Здесь без вариантов - ни какого Click.

Но это всё общие рассуждения.
На практике обоснованное использование у одной кнопки команды и Click встречается крайне редко.
Допустим, диалоговое окно: по команде - передаются данные в VM, а по Click - закрывается окно.
Так как VM понятия не имеет об Окне, но ей нужны данные, то такое разделение вполне обоснованно.

Но в большинстве случаев, потребность в одновременном использование с большой вероятностью говорит о каких-то проблемах в Решении в целом, его неверной архитектуре.
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
17.10.2020, 00:12  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
"Красиво" - зависит от функции возложенной на этот метод.
может это и нестандартно. Но...
при вводе в TextBox числа, метод Load подгружает во View числа.
Также нужно подгружать те же числа (но именно по номеру сидящему в свойстве) из кнопки в другом окне.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
17.10.2020, 00:24
Цитата Сообщение от Berendom Посмотреть сообщение
при вводе в TextBox числа, метод Load подгружает во View числа.
Также нужно подгружать те же числа (но именно по номеру сидящему в свойстве) из кнопки в другом окне.
Здесь уже "некрасиво".

"Красиво" - это Решение в паттерне MVVM.

Поэтому рассуждения должны начинаться с Модели: в Модели есть такие-то данные и такие-то методы.
ViewModel таким-то образом отражает эти Данные в своих свойствах.
При изменении такого-то свойства VM его значение должно быть передано в Модель.

Рассуждая "от View" вы поневоле будет делать "некрасивую" реализацию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.10.2020, 00:24

Как выставить значение true свойства MdiList для пункта меню ArrangeIcons в menuStrip, если там этого свойства нет?
В лабораторной работе нужно выполнить некоторые шаги: в одном из них, одному из пунктов меню - Arrange Icons, созданного в menuStrip, нужно...

Как сделать доступ извне
Всем привет. Не могли бы подсказать нубу практическиские шаги, как сделать вот какую вещь: Есть комп с windows 8.1, на котором стоит...

Как передать код компилятору извне?
Хочу написать красивую оболочку со всякими штуками. Можно ли написать саму оболочку и передавать код компилятору паскаль, чтоб не писать...

Как извне подключиться к ftp localhost?
Вопрос, на самом деле, простой, но вот первый раз сталкиваюсь, а у кого спросить, неизвестно, что и привело меня на этот форум. Сервер ftp...

Как закрыть модальное окно извне?
Добрый день! Не могу уже несколько дней разобраться как реализовать следующее: У меня есть основная форма MainForm Из нее...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru