Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 12.08.2024
Сообщений: 7

Как правильно отправлять изменения через Binding в MVVM

12.08.2024, 17:20. Показов 1344. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую. Делаю проект и столкнулся с проблемой, что при связке ViewModel с TextBox, который берет данные из объекта класса - выводит он их нормально, и обратно в класс отправляет измененные нормально. Но, если другие объекты зависят от этой переменной - они этого обновления не видят и ничего не перерисовывают. Набросал простенький пример, чтобы не тащить сюда весь оригинальный код:

Есть класс для реализации модели MVVM

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        public void OnPropertyChanged([CallerMemberName] string propName = null)
        {
 
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
 
 
        }
 
    }
Есть объект класса для примера, который хранит данные о чем-то

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   class User:ViewModelBase
    {
        private double a;
        private double b;
 
        public double A { get => a; set => a = value; }
        public double B { get => b; set => b = value; }
 
        public User(double aa, double bb)
        {
            A = aa;
            B = bb;
        }
    }
    }
Есть ViewModel для связки этого всего

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
class UserVM:ViewModelBase
    {
        private User _user;
        private double _borderWidth;
 
        public UserVM()
        {
            _user = new User(11, 22);
            _borderWidth = 50;
        }
 
     
 
        public double GetA
        {
            get { return _user.A; }
            set
            {
                _user.A = value;
                OnPropertyChanged();
                
            }
        }
 
        public double GetB
        {
            get { return _user.B; }
            set { _user.B = value;OnPropertyChanged(); }
        }
 
        public double GetBorderWitch
        {
            get
            {
                
                return _borderWidth;
            }
 
            set
            {
                _borderWidth = value+GetA;
                OnPropertyChanged();
            }
        }
 
    }
и главная ViewModel, которая в дальнейшем будет управлять всеми остальными

C#
1
2
3
4
5
6
7
8
9
class MainVM:ViewModelBase
    {
        public UserVM UVM { get; set; }
 
        public MainVM()
        {
            UVM = new UserVM();
        }
    }
Главное окно размечено так

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<Window x:Class="collider.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:collider"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
 
    <Window.DataContext>
        <local:MainVM/>
 
    </Window.DataContext>
    <Grid>
        <TextBox Text="{Binding UVM.GetA}" Width="200" Height="50" Margin="46.344,29.147,545.655,339.852" UseLayoutRounding="False"/>
        <TextBox Text="{Binding UVM.GetA, UpdateSourceTrigger=PropertyChanged}" Width="200" Height="50" Margin="367.245,29.361,224.754,339.639" UseLayoutRounding="False"/>
 
        <Border CornerRadius="20" Width="{Binding UVM.GetBorderWitch}" Background="Green" Margin="240,239,451,129"/>
 
    </Grid>
</Window>
Вопрос вот в чем. 2 текстбокса я привязал к одному свойству, чтобы проверить, что при изменении текста в текстбокс он все таки отправляется обратно в объект. и да, оба текстбокса информацию обновляют друг за другом, подгружая ее из объекта, значит обмен между объектом и текстбоксом происходит.

НО

Border вообще никак не реагирует на то, что в его свойстве, откуда он берет свой Width теперь одна из переменных поменяла свое значение, следовательно GetBorderWitch должен вернуть другое значение, но он его не возвращает.

Пробовал расставлять точки останова и дебаги и вижу, что код к этому свойству вообще не переходит и не обращается. Когда я меняю текстбоксы - там да, изменения выводятся в лог. А то что код обращается к свойству GetBorderWitch еще раз - этого нет вообще.

Если я меняю значение изначальное в конструкторе, то он при загрузке его применяет, что означает, что значение из GetBorderWitch он всё таки видит хотя бы один раз при загрузке.

Подскажите пожалуйста, что я делаю не так, как правильно делать этот двухсторонний обмен?

P. S. Заметил еще, что если вводить информацию во второй текстбокс, то первый текстбокс свой текст обновляет в прямом эфире. Но если начинать вводить текст в первый текстбокс, второй обновится только тогда, когда я выйду из первого и тыкну на второй. Может быть это тоже как-то связано?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.08.2024, 17:20
Ответы с готовыми решениями:

Как правильно отправлять и принимать данные через TCP клиент-серверные приложения?
После прочтения темы https://www.cyberforum.ru/vb-net/thread235601.html захотелось самому во всём разобраться. Написал классы для клиента и...

Как правильно добавить данные в коллекцию через модальное окно? MVVM
Имеется форма, на ней ListBox, связанный с ObservableCollection. Необходимо по кнопке открывать новое окно, где можно ввести данные,...

MVVM, непонятки c binding-ом
WPF + MVVM light Не работает связывание свойств ViewModel с View. При открытии формы отрабатывает локатор - это видно по логам и...

20
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
19.08.2024, 19:16
Студворк — интернет-сервис помощи студентам
wizard41, тогда нужен некий индикатор (флаг) источника изменений.
Пример:
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
using Simplified;
 
namespace Core2024.CF.UnitConverter
{
    public class UnitConverterViewModel : BaseInpc
    {
        private double _first;
        private double _second;
        private double _conversionFactor;
 
        public double First { get => _first; set => Set(ref _first, value); }
        public double Second { get => _second; set => Set(ref _second, value); }
        public double ConversionFactor { get => _conversionFactor; set => Set(ref _conversionFactor, value); }
 
        private string mode = "Ожидание изменений";
        protected override void OnPropertyChanged(string propertyName, object oldValue, object newValue)
        {
            base.OnPropertyChanged(propertyName, oldValue, newValue);
 
            if (mode is "Ожидание изменений" && propertyName is nameof(First) or nameof(Second) or nameof(ConversionFactor))
            {
                mode = "Идёт Конверсия";
                if (propertyName is nameof(Second))
                {
                    First = Second / ConversionFactor;
                }
                else
                {
                    Second = First * ConversionFactor;
                }
                mode = "Ожидание изменений";
            }
        }
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<Window x:Class="Core2024.CF.UnitConverter.UnitConverterWindow"
        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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Core2024.CF.UnitConverter"
        mc:Ignorable="d"
        Title="UnitConverterWindow" Height="450" Width="800" DataContext="{DynamicResource vm}">
    <Window.Resources>
        <local:UnitConverterViewModel x:Key="vm"
                                      First="12"
                                      ConversionFactor="2.5"/>
    </Window.Resources>
    <UniformGrid Rows="1" VerticalAlignment="Center" Margin="5">
        <TextBox Text="{Binding First, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" Margin="5"/>
        <TextBox Text="{Binding ConversionFactor, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" Margin="5"/>
        <TextBox Text="{Binding Second, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" Margin="5"/>
    </UniformGrid>
</Window>
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.08.2024, 19:16
Помогаю со студенческими работами здесь

Binding форм и mvvm
mvvm и binding не ясно как связываются view c viewmodel в некоторых случаях, например имеется основное окно MainWindowView c...

Mvvm binding и DataContext
Доброго времени суток. Подскажите пожалуйста, обязательно ли в коде инициализировать DataContext = new *и имя viewmodel*; Вычитал что...

Binding StringBuilder MVVM
не получается обновить свойства, текст добавляется но не обновляется при выполнении StringBuilder.Append. в Mode значение TwoWay. если...

MVVM TreeView.SelectedItem Binding
Как соблюдая паттерн MVVM в MVC привязать (через Binding) переменную к TreeView.SelectedItem? Пока что просто обрабатываю событие...

Binding PasswordBox'a при MVVM
Доброго времени суток! Делаю окно авторизации на WPF с использованием паттерна MVVM, хотел связать Password у PasswordBox'a, но он не...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru