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

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

24.09.2020, 18:09. Показов 8172. Ответов 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
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
18.10.2020, 21:19  [ТС]
Студворк — интернет-сервис помощи студентам
Элд Хасп,

A как из code behind DialogWindow? Просто DataContext занят.
Вложения
Тип файла: rar RaisePropertyChanged(Berendom2).rar (951.7 Кб, 1 просмотров)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
18.10.2020, 21:56
Цитата Сообщение от Berendom Посмотреть сообщение
Просто DataContext занят.
???
Вы уверены?

Посмотрите в "Динамическом обозревателе свойств" во время исполнения программы.
DataContext у DialogWindow пустой.
Может вы хотели туда, что-то за писать, но по факту этого не сделано.

Но суть это не важно.
В любом случае надо придумать механизм передачи во DialogWindow способа вызова Load().
Вариантов несколько.
И концептуальный выбор одного из них зависит от архитектуры Решения, задачи, функции этого меода.

Если исходить из того, что для View этот метод инкапсулирован в команде главной VM и не важно, что он делает, то можно инициализировать главную VM в Ресурсах App и биндиться к команде напрямую из любого Окна.
C#
28
29
30
31
32
33
34
35
36
37
38
39
40
        // Method
        private void Load()
        {
            int number = SelectedItem ?? -1;
 
            // нужна возможность стороннего исполнения из другой VM, но чтобы через метод проходил параметр
            // в данный момент вписаный в Property
 
        }
 
        private RelayCommand _loadCommand;
        public RelayCommand LoadCommand => _loadCommand
            ?? (_loadCommand = new RelayCommand(Load));
XML
1
2
3
4
5
6
7
8
9
10
<Application
    x:Class="RaisePropertyChanged.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:RaisePropertyChanged"
    StartupUri="MainWindow.xaml">
    <Application.Resources>
        <local:ViewModel x:Key="mainViewModel"/>
    </Application.Resources>
</Application>
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Window
    x:Class="RaisePropertyChanged.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:RaisePropertyChanged"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d"
    DataContext="{DynamicResource mainViewModel}">
    <Grid>
        <DockPanel Background="LightGray" LastChildFill="False">
DialogWindow.xaml
XML
17
18
19
20
21
22
            <UniformGrid DockPanel.Dock="Bottom" Rows="1">
                <Button
                    Height="30"
                    Margin="4"
                    Content="Да"
                    Command="{Binding LoadCommand, Mode=OneWay, Source={StaticResource mainViewModel}}"/>
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
18.10.2020, 22:10  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
???
Вы уверены?
Уверен.

C#
1
 d:DataContext="{d:DesignInstance model:Item}"
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
18.10.2020, 22:16
Цитата Сообщение от Berendom Посмотреть сообщение
Уверен.
Не будьте так уверены....

Это Контекст Данных Времени Разработки.
А во Время Исполнения у вас DataContext пустой.

Для выявления подобных багов используйте "Визуальное динамическое дерево" и "Динамический обозреватель свойств".
Допустим, мне влазить в дебри кода для ответа на ваш вопрос не надо.
Я запустил приложение, открыл Окно, посмотрел "Динамический обозреватель свойств".
DataContext - пустой.
Всё.

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

А просто нельзя сделать экземпляр VM и запускать ее методы из другого класса?

Добавлено через 9 минут
Красиво можно как-то сделать из CB диалога запустить Load();
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
18.10.2020, 22:45
Цитата Сообщение от Berendom Посмотреть сообщение
А просто нельзя сделать экземпляр VM и запускать ее методы из другого класса?
Это же реализовано в моём примере RaisePropertyChanged(Berendom1).rar

Что не так с ним?

Добавлено через 1 минуту
Цитата Сообщение от Berendom Посмотреть сообщение
Красиво можно как-то сделать из CB диалога запустить Load();
Load - это метод другой VM, на которую у DialogWindow нет даже ссылки.

Можно обратиться, но это точно не будет "красиво".
Это будут костыли.
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
18.10.2020, 22:51  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что не так с ним?
все красиво и нетранспарентно. Но работает.
Но я не могу использовать его у себя т.к. профукал, что DataContext у DailogWindow занят.
А у вас все через него идет.

DialogWindow.xaml.cs

C#
1
 Item item => DataContext as Item;
или я не прав?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
18.10.2020, 23:11
Тогда не понял вашего вопроса сделать экземпляр VM и запускать ее методы из другого класса?
Этот экземпляр уже есть в основном окне, но в Диалоговое в контекст данных его не установишь - он у вас будет использоваться для других целей.
Но как-то же надо передать Диалогу ссылку на экземпляр.
Самый просо способ сделать это через Ресурсы App - они общие для всех окон.

Я показал выше как это сделать.
Чем такой вариант не устраивает?
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
18.10.2020, 23:18  [ТС]
Я могу просто сделать так.

В CB диалогового окна.

C#
1
ViewModel() vm =new ViewModel();

C#
1
2
3
4
5
InvokeLoadMethod();
{
   vm.Load();
 
}
так можно, но так пропадает передача number. Я уже писал об этом.

Так как DataContext Диалога занят ваш способ не пойдет.
Есть еще какие-то варианты?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
18.10.2020, 23:26
Цитата Сообщение от Berendom Посмотреть сообщение
Я могу просто сделать так.
В CB диалогового окна.
Нет не можете.
Это будут разные экземпляра.
Вам нужен не любой экземпляр этого типа, а именно тот который используется Главным Окном.
Поэтому экземпляр должен создаваться в слое "над" Окнами.
И оба Окна должны его получать от из вне.

Самое простое и логичное место для этого экземпляра - это ресурсы App.

Добавлено через 2 минуты
Цитата Сообщение от Berendom Посмотреть сообщение
Так как DataContext Диалога занят ваш способ не пойдет.
Есть еще какие-то варианты?
Вы что совершенно не смотрите коды какие я выкладываю?

В посте инициализировать главную VM в Ресурсах App и биндиться к команде напрямую из любого Окна не используется DataContext Диалогового Окна.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
19.10.2020, 08:13
Цитата Сообщение от кружок-ДДТ Посмотреть сообщение
а если серьезно. ТЗ, софтина для элеваторов в СХ. Отправил три разных эксэшника (WPF GUI даже без биндинга) местному админу. Тот ездил по объектам (в рамках пункта договора) и показывал местным салохам GUI. Так был выбран вариант GUI
на базе которого уже строилось все остальное. Договор!
И даже потом после приемки, в остаточных работах, они GUI этот пару раз вызывали до-править как им надо.
Model вообще никого не интересовала. Работает и работает.
Дайте угадаю, все данные хранились в контролах, и чтобы добавить новый функционал, разрабы всячески упирались ?
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
23.10.2020, 14:03  [ТС]
Цитата Сообщение от Почтальон Посмотреть сообщение
Дайте угадаю, все данные хранились в контролах, и чтобы добавить новый функционал, разрабы всячески упирались ?
Почтальон, это же азы, данные лет как "-цать" все уже хранят в БД. Даже я это знаю.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
23.10.2020, 14:10
Цитата Сообщение от Berendom Посмотреть сообщение
Почтальон, это же азы, данные лет как "-цать" все уже хранят в БД. Даже я это знаю.
Он вам пишет за хранение во время исполнения программы.
В современном WPF принято хранить Данные в Model.
А в UI контролах только привязки получающие через ViewModel значения Данных.
1
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
23.10.2020, 16:52  [ТС]
Элд Хасп,

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
// Property
 public const string SelectedItemPropertyName = "SelectedItem";
 
    private long? _selectedItem;
    public long? SelectedItem
    {
        get
        {
            return _selectedItem;
        }
        set
        {
            Set(SelectedItemPropertyName, ref _selectedItem, value);
        }
    }
 
 
 
 // Method
  public void Load()
        {
 
            long ID = SelectedItem ?? -1;
 
        }
 
 
 
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();
 
        }
oldvalue, newvalue не нравится тип с ?. Как быть?

и на синтакс жалуется. Запятые после Default.

Добавлено через 1 час 34 минуты
ошибка.
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
23.10.2020, 19:02
Цитата Сообщение от Berendom Посмотреть сообщение
oldvalue, newvalue не нравится тип с ?. Как быть?
А зачем вы используете эту прегрузку?
Вам же не нужны значения.
Вам нужно только имя свойства.

Используйте другую перегрузку:
C#
29
30
31
32
33
34
35
        public override void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            base.RaisePropertyChanged(propertyName);
            if (propertyName == nameof(SelectedItem))
                Load();
 
        }
Добавлено через 1 минуту
Цитата Сообщение от Berendom Посмотреть сообщение
ошибка.
A value of type '?' cannot be used as a default parameter because there are no standard conversions to type 'T'
Конкретно эта ошибка, похоже из-за старой версии чего либо: VS, Framework или C#.
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
23.10.2020, 19:26  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А зачем вы используете эту прегрузку?
а... сейчас проверю.

да это не я придумал. Вы ее там где-то выше применяли.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
23.10.2020, 19:31
Цитата Сообщение от Berendom Посмотреть сообщение
да это не я придумал. Вы ее там где-то выше применяли.
Я же писал, что не пользуюсь MVVMLight и плохо его знаю.
Использую так сказать "на ощупь" - исходя из общих принципов построения Net, WPF, MVVM.
В тот раз, наверное, "попала под руку" та перегрузка - я даже не обратил внимания.
У меня они все работают нормально.
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
23.10.2020, 20:47  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У меня они все работают нормально.
да и я разницы не заметил.

Элд Хасп, вопрос все еще открыт.

Как все-таки поднять метод Load, если DataContext у DialogWindow занят?
Вложения
Тип файла: zip RaisePropertyChanged(Berendom3).zip (2.56 Мб, 0 просмотров)
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
23.10.2020, 21:00  [ТС]
если создаешь экземпляр ViewModel , то метод исполняется, но в холостую.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
23.10.2020, 22:15
Цитата Сообщение от Berendom Посмотреть сообщение
Как все-таки поднять метод Load, если DataContext у DialogWindow занят?
Я же дал вам Решение!
Я уже раза три пишу вам.

Пост #82 - что в нём не устраивает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.10.2020, 22:15

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru