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

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

24.09.2020, 18:09. Показов 8186. Ответов 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
28.09.2020, 13:00
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Berendom Посмотреть сообщение
Да и не работает это.
Сейчас сам переименую и скину архив.

Цитата Сообщение от Berendom Посмотреть сообщение
а каким образом связано исполнение метода update что DialogWindowViewModel с исполнением метода Load?
Надо как-то связать разные объект (создать зависимости).
В данном случае, при создании DialogWindowViewModel в конструктор передаётся делегат метода Load(), этот делегат запоминается в поле this.update = update ?? throw new ArgumentNullException();.
Для вызова метода по ссылке в делегате надо обратиться к этому полю как к методу update()
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru