Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2280 / 1596 / 400
Регистрация: 26.06.2017
Сообщений: 4,720
Записей в блоге: 1

Несколько ViewModel одного окна с INotifyDataErrorInfo

12.08.2025, 11:40. Показов 988. Ответов 14
Метки нет (Все метки)

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

У окна есть своя ViewModel, однако внутри окна есть несколько UserControl со своими ViewModel. Все ViewModel реализуют INotifyDataErrorInfo. Проблема - при наличии ошибок валидации в ViewModel принадлежащих UserControl ViewModel окна не знает о них.
Логично чтобы ViewModel окна знала о всех ViewModel UserControl-ов для того, чтобы она имела доступ к ошибкам в них. Будет ли правильным, что ViewModel окна будет порождать ViewModel UserControl-ов и иметь на них ссылки? Или есть вариант по лучше?
В настоящий момент ViewModel UserControl-ов создаются в слое View и там же связываются.
Пример описанного взаимодействия можно посмотреть в ответе №1 тут: ru .stackoverflow .com/questions/634115/Как-в-wpf-менять-содержимое-окна
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.08.2025, 11:40
Ответы с готовыми решениями:

Как из ViewModel UserControl'a изменить свойство в ViewModel главного окна?
Недавно начал попытки создавать приложение WPF с применением MVVM, и у меня возник вопрос, который...

Валидация субсвойств с применением INotifyDataErrorInfo
Добрый день. Есть класс реализующий INotifyDataErrorInfo типа такого public class MyViewModel :...

Mvvm ViewModel в ViewModel
Есть одно окошко там много вкладок, в каждой вкладке есть подвкладки и там много разных таблиц и...

14
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
12.08.2025, 13:38
Цитата Сообщение от Uswer Посмотреть сообщение
Будет ли правильным, что ViewModel окна будет порождать ViewModel UserControl-ов и иметь на них ссылки?
Да, это нормальный вариант
Цитата Сообщение от Uswer Посмотреть сообщение
Или есть вариант по лучше?
В настоящий момент ViewModel UserControl-ов создаются в слое View и там же связываются.
Создавать ViewModel во вьюхах, в целом, - не тру.

Если хотите проще и по MVVM, то создавайте ViewModel внутри ViewModel. Прокидывайте информацию о валидации по событиям (члены класса event).

Для справки: если требуется более высокий уровень, то есть библиотека PRISM. Но там взаимодействие между ViewModel организовано сложнее - через IEventAggregator. А регистрация View\ViewModel в нудные участки окна происходит через регионы.
2
2280 / 1596 / 400
Регистрация: 26.06.2017
Сообщений: 4,720
Записей в блоге: 1
12.08.2025, 14:02  [ТС]
За ответ спасибо.

Цитата Сообщение от novikov.ea Посмотреть сообщение
Создавать ViewModel во вьюхах, в целом, - не тру.
Хм, но в примере по указанной выше ссылке делается именно так. Да и много где VM создаётся прямо в XAML и это считается норм. И, как бы, то, что View знает (управляет) о своей VM тоже по паттерну MVVM.
novikov.ea, прокомментируйте ваше утверждение пожалуйста.
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
12.08.2025, 14:50
Цитата Сообщение от Uswer Посмотреть сообщение
много где VM создаётся прямо в XAML и это считается норм
Так делают, потому что
1) Это работает
2) Это просто

Если вы делаете приложение из одного окошка, то этот подход работает. Но, если нужно делать более сложное приложение или большего размера, то такой подход будет нарушать MVVM, т.к. нужно
1) Передавать зависимости в конструкторы ViewModel. Как вы создадите ViewModel внутри View, прокинув в конструктор все требуемые зависимости?
2) Менять содержимое окна (заменять вьюхи). Чтобы заменить view по MVVM надо в свойство задать другую ViewModel, а о ней знает только сама View
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
12.08.2025, 17:29
Цитата Сообщение от Uswer Посмотреть сообщение
Пример описанного взаимодействия можно посмотреть в ответе №1 тут: ru .stackoverflow .com/questions/634115/Как-в-wpf-менять-содержимое-окна
Дополню ответы от novikov.ea.

В пример на stackoverflow ru сразу написано :
....рабочий каркас приложения в духе MVVM...
.

Теперь по существу вашего вопроса.
Если я правильно понял, то окно разбито на несколько регионов. Разбивка статична, у каждого региона своя жёстко заданная UserControl'ом компоновка. У каждого региона и своя VM. Окно, его VM и VM регионов живут весь сеанс приложения. Логика основной VM должна зависеть от логики VM регионов.

В такой задаче оптимальным было бы создание рабочий каркас приложения в духе VM регионов в основной:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class MainViewModel
{
    public MainViewModel()
    {
        // Логика инициализации всех VM
        // и создания зависимостей между ними.
    }
 
 
    public PeopleViewMode PeopleVM {get;}
    public ViewMode PeopleVM {get;}
}
0
2280 / 1596 / 400
Регистрация: 26.06.2017
Сообщений: 4,720
Записей в блоге: 1
12.08.2025, 18:24  [ТС]
Всё равно не понимаю как в VM окна передавать все ошибки "дочерних" VM. Дело в том, что в момент создания некоторые VM проводят валидацию свойств. Таким образом даже подписавшись на событие ErrorsChanged дочерних VM я получу извещения только об ошибках возникающих в процессе взаимодействия с пользователем, а те что были на момент создания VM остаются незамеченными.
Мои варианты решения проблемы:
- Либо надо делать общую VM со всеми валидируемыми данными, тогда проблем нет, но она становится адски перегруженной.
- Либо надо изобретать свой EventAggregator или разбираться с PRISM, но ни то, ни другое делать не хочется ради одного окна и пары-тройки UserControl.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если я правильно понял
Да, вы поняли верно.

Добавлено через 38 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В такой задаче оптимальным было бы создание рабочий каркас
В настоящий момент почти так и сделано за исключением того, что дочерние VM создаются в момент обращения к ним через свойство VM окна, а не создаются в его конструкторе.
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
12.08.2025, 19:26
В простом варианте реализации дочерние ViewModel должны иметь свойство IsValid и событие IsValidChanged
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
public class WindowViewModel : ReactiveObject, IDisposable
{
    public WindowViewModel(IViewModelFactory viewModelFactory)
    {
        FirstVM = viewModelFactory.CreateFirstVM();
        SecondViewModel = viewModelFactory.SecondVM();
        
        UpdateIsValid();
 
        FirstVM.IsValidChanged += OnIsValidChanged;
        SecondVM.IsValidChanged += OnIsValidChanged;
    }
 
    public FirstViewModel FirstVM { get; }
 
    public SecondViewModel SecondVM { get; }
 
    [Reactive]
    public bool IsValid
 
    private void OnIsValidChanged()
    {
        UpdateIsValid();
    }
    
    private void UpdateIsValid()
    {
        IsValid = FirstVM.IsValid && SecondVM.IsValid;
    }
    
    public void Dispose()
    {
        FirstVM.IsValidChanged -= OnIsValidChanged;
        SecondVM.IsValidChanged -= OnIsValidChanged;
    }
}
 
public class FirstViewModel : ReactiveObject
{
    [Reactive]
    public bool IsValid
 
    public event Action IsValidChanged;
}
 
public class SecondViewModel : ReactiveObject
{
    [Reactive]
    public bool IsValid
 
    public event Action IsValidChanged;
 
}
0
2280 / 1596 / 400
Регистрация: 26.06.2017
Сообщений: 4,720
Записей в блоге: 1
12.08.2025, 19:35  [ТС]
Цитата Сообщение от novikov.ea Посмотреть сообщение
ViewModel должны иметь свойство IsValid и событие IsValidChanged
С учётом того, что VM реализуют INotifyDataErrorInfo мне кажется это излишним, так как вместо IsValid можно воспользоваться HasErrors, а вместо IsValidChanged у меня есть возбуждение события OnPropertyChanged
C#
1
OnPropertyChanged(nameof(HasErrors));
Размышляя прихожу к тому, что нужен класс-посредник для аккумулирования всех ошибок всех VM, т.е. упрощённый EventAggregator.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
12.08.2025, 23:53
Цитата Сообщение от Uswer Посмотреть сообщение
за исключением того, что дочерние VM создаются в момент обращения к ним через свойство VM окна
Можно это так.
Это детали реализации и не принципиально.

Цитата Сообщение от Uswer Посмотреть сообщение
Всё равно не понимаю как в VM окна передавать все ошибки "дочерних" VM.
Не вижу в чём сложность.

Один из возможных вариантов:
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
public class MainViewModel
{
    public MainViewModel()
    {
        // Логика инициализации всех VM
        // и создания зависимостей между ними.
 
       PeopleVM.ErrorsChanged += delegate
                                 {
                                     ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(nameof(PeopleVM)));
                                 };
       ViewModel.ErrorsChanged += delegate
                                 {
                                      ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(nameof(ViewModel)));
                                 };
    }
 
 
    // Если изменяется состояние ошибки,
    // то его надо записать в поле privateHasError
    //и потом поднять событие ErrorsChanged 
    public bool HasError => PeopleVM.HasError || PeopleVM.HasError || privateHasError;
    private bool privateHasError = false;
 
    public IEnumerable GetErrors (string? propertyName)
    {
         if(propertyName == nameof(PeopleVM))
         {
             foreach(var error in PeopleVM.GetErrors)
                 yield return error;
         }
         else if // аналогичная логика
    }
 
    public PeopleViewMode PeopleVM {get;}
    public ViewModel PeopleVM {get;}
}
0
2280 / 1596 / 400
Регистрация: 26.06.2017
Сообщений: 4,720
Записей в блоге: 1
13.08.2025, 08:20  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не вижу в чём сложность.
Ошибки в VM возникают до подписки на событие: создаётся экземпляр VM, в нём возникают ошибки и только после создания экземпляра происходит подписка на событие ErrorsChanged. Таким образом ошибки в VM есть, но подписчики о них не в курсе.
VM окна
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
class MainViewModel
{
    // ViewModel для UserControl.
    private DataBaseUserControlViewModel _dataBaseSettingsUCVM;
 
    public DataBaseUserControlViewModel DataBaseSettingsUCVM
    {
      get
      {
        if (_dataBaseSettingsUCVM == null)
        {
          _dataBaseSettingsUCVM = new DataBaseUserControlViewModel();
          _dataBaseSettingsUCVM.ErrorsChanged += UserControlViewModelErrorChanged;
        }
 
       return _dataBaseSettingsUCVM;
      }
    }
 
    public MenuSettingsWindowViewModel()  { }
 
    /// <summary>
    /// Обработчик события ErrorsChanged возникающего в ViewModel UserControl-ов.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void UserControlViewModelErrorChanged(object sender, DataErrorsChangedEventArgs e)
    {
      какая-то логика
    }
}


VM UserControl-а
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
class DataBaseUserControlViewModel : BaseViewModel
  {
    public string DataBaseConnectionString
    {
      get => _DataBaseConnectionString;
      set
      {
       _DataBaseConnectionPath = value;
        ValidateDataBaseConnectionString(value);
      }
    }
 
    public DataBaseUserControlViewModel()  
    { 
       DataBaseConnectionString = Settings.DBConnectionString;
    }
 
    /// <summary>
    /// Проверяет валидность строки подключения к базе данных и 
    /// при ошибке добавляет её описание через INotifyDataErrorInfo.
    /// </summary>
    /// <param name="value">Строка подключения.</param>
    private void ValidateDataBaseConnectionString(string DbConnectionString)
    {
      ClearValidationErrors("DataBaseConnectionString");
      if (string.IsNullOrEmpty(DbConnectionString))
        AddValidationError("Строка подключения не может быть пустой.", "DataBaseConnectionString");
    }
  }
}
0
 Аватар для Andrey-MSK
3308 / 2196 / 386
Регистрация: 14.08.2018
Сообщений: 7,393
Записей в блоге: 4
13.08.2025, 08:30
Цитата Сообщение от Uswer Посмотреть сообщение
C#
1
private void ValidateDataBaseConnectionString(string DbConnectionString)
Тут не ошибку нужно генерировать, а сразу исключение и бросать его в основной поток, это ведь не просто ошибка, от этого зависит работоспособность...
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
13.08.2025, 09:02
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
не ошибку нужно генерировать, а сразу исключение и бросать его в основной поток, это ведь не просто ошибка, от этого зависит работоспособность
Я думаю, что это программа-конфигуратор. Пользователь вводит строку подключения, а валидация проверяет, что строка не пустая.
Цитата Сообщение от Uswer Посмотреть сообщение
Ошибки в VM возникают до подписки на событие: создаётся экземпляр VM, в нём возникают ошибки и только после создания экземпляра происходит подписка на событие ErrorsChanged. Таким образом ошибки в VM есть, но подписчики о них не в курсе.
Uswer, я вам написал, как получить ошибки в дочерних ViewModel'ях до подписки на событие. В моём примере есть свойство IsValid. После создания дочерних ViewModel'ей можно использовать это свойство. В вашем случае нужно получить список ошибок. Поэтому создайте свойство ValidationErrors вместо IsValid. И сможете получать список ошибок после создания дочерних ViewModel'ей.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
13.08.2025, 09:35
Цитата Сообщение от Uswer Посмотреть сообщение
Ошибки в VM возникают до подписки на событие: создаётся экземпляр VM, в нём возникают ошибки и только после создания экземпляра происходит подписка на событие ErrorsChanged. Таким образом ошибки в VM есть, но подписчики о них не в курсе.
Ну, так нужно правильно коннектить дочерние VM к основной.
Конкретно в вашей задаче, ленивая инициализация не решает никаких задач, но значительно усложняет коннект.

Я не знаю вашу реализацию BaseViewModel, поэтом на всякий случай уточняю, некоторые моменты на типичной реализации:
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
63
64
65
66
67
68
69
70
71
class BaseViewModel: INotifyPropertyChanged, INotifyDataErrorInfo
{
     // Словарь со списком ошибок для каждого валидируемого свойства.
     private readonly Dictionary<string, List<object>> errors = new();
 
     // Есть ошибка хоть в одном из свойств
     public bool HasError => errors.Count > 0;
 
     // Возвращение ошибок одного свойства или всех свойств,
     // если propertyName = null или Empty
     public IEnumerable GetErrors (string? propertyName)
     {
         // Какая-то логика
     }
 
     // Добавление ошибки в список ошибок свойства
     protected void AddError(string propertyName, object error)
     {
        // Какая-то логика
        RaiseErrorsChanged(propertyName);
     }
 
     // Добавление списка ошибок в список ошибок свойства
     protected void AddErrors(string propertyName, IList errors)
     {
        // Какая-то логика
        RaiseErrorsChanged(propertyName);
     }
 
     // Замена списка ошибок свойства
     protected void ReplaceErrors(string propertyName, IList errors)
     {
        // Какая-то логика
        RaiseErrorsChanged(propertyName);
     }
 
     // Удаление ошибки из списка ошибок свойства
     protected void AddError(string propertyName, object error)
     {
        // Какая-то логика
        RaiseErrorsChanged(propertyName);
     }
 
 
     // Очистка списка ошибок свойства
     protected void ClearErrors(string propertyName)
     {
        // Какая-то логика
        RaiseErrorsChanged(propertyName);
     }
 
 
     // Очистка словаря ошибок всех свойств
     protected void ClearErrors(string propertyName)
     {
        // Какая-то логика
        RaiseErrorsChanged(propertyName);
     }
 
 
    // Поднятие события изменения ошибок
    protected void RaiseErrorsChanged([CallerMemberName] string? propertyName)
    {
         ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName ?? string.Empty));
 
         // Для HasError желательно каждый раз извещать об его изменении
         PropertyChanged?.Invoke(this, HasErrorPropertyChangedArgs);
    }
 
    public static readonly PropertyChangedEventArgs HasErrorPropertyChangedArgs = new(nameof(HasError));
}
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
class MainViewModel: BaseViewModel
{
 
    public DataBaseUserControlViewModel DataBaseSettingsUCVM
    {
      get
      {
        if (_dataBaseSettingsUCVM == null)
        {
          _dataBaseSettingsUCVM = new DataBaseUserControlViewModel();
          _dataBaseSettingsUCVM.ErrorsChanged += delegate {UserControlViewModelErrorChanged();};
 
          // После создания экземпляра DataBaseUserControlViewModel
          // его нужно ОБЯЗАТЕЛЬНО валидировать!
          UserControlViewModelErrorChanged();
        }
 
       return _dataBaseSettingsUCVM;
      }
    }
 
 
    private void UserControlViewModelErrorChanged()
    {
        if(DataBaseSettingsUCVM.HasError)
        {
             ReplaceErrors(nameof(DataBaseSettingsUCVM), DataBaseSettingsUCVM.GetErrors(string.Empty).ToList());
        }
        else
        {
             ClearErrors(nameof(DataBaseSettingsUCVM));
        }
    }
0
2280 / 1596 / 400
Регистрация: 26.06.2017
Сообщений: 4,720
Записей в блоге: 1
13.08.2025, 11:52  [ТС]
Элд Хасп, да вы провидец!
Цитата Сообщение от Элд Хасп Посмотреть сообщение
на всякий случай уточняю, некоторые моменты на типичной реализации:
Именно так. Моя BaseViewModel реализует только INotifyPropertyChanged и INotifyDataErrorInfo, только набор методов несколько иной, но это не суть.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
// После создания экземпляра DataBaseUserControlViewModel
// его нужно ОБЯЗАТЕЛЬНО валидировать!
Если бы я сделал это так, то и вопрос темы не возник. Однако мои UserControlViewModel полностью инкапсулирую логику валидации (т.к. именно они реализуют INotifyDataErrorInfo, а не кто-то сверху) и работы с данными, поэтому валидация извне выглядит как костыль.

Добавлено через 7 минут
Решено.

Всем участникам обсуждения - большое спасибо!

Решение. Я написал очень простой агрегатор событий ErrorsChanged. Он создаётся в MainVM и передаётся во все UserControlVM, где в конструкторе выполняется регистрация отправителей события. Всё.
Теперь события ErrorsChanged возникающие на любой стадии жизни UserControlVM прокидываются в MainVM, где и обрабатываются.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
13.08.2025, 13:16
Uswer, вы не поняли логику моего примера.
Валидация свойств дочерних VM - это функция самой дочерней VM.
Основная VM валидирует свои свойства.
А так как одним из свойств является экземпляр дочерней VM, то проверка его валидности это задача основной VM.
Уточняю. Проверка валидности экземпляра, а не свойств экземпляра.

Поэтому в моём примере метод проверки валидации проверяет наличие ошибки и если она есть, то агрегирует все ошибки экземпляра.
В свойства экземпляра логика не лезет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.08.2025, 13:16
Помогаю со студенческими работами здесь

WPF получить доступ из одной viewmodel к другой viewmodel
Собственно есть у меня две viewmodel, mainviewmodel и settingsviewmodel, в mainviewmodel есть вот...

Как зарегистрировать ViewModel через Autofac, создав между ViewModel и нужным View DataContext связь?
Доброго времени суток. Есть желание при регистрации ViewModel'и сразу же &quot;подключиться&quot; к...

(GalaSoft.MvvmLight) В одном окне используются 2 ViewModel. Вылетает исключение при создании окна
Здравствуйте. В общем, есть главное окно, DataContext которого: DataContext=&quot;{Binding...

Открытие дочернего окна, передача данных между ViewModel-ями окон
Добрый день. Есть концептуальный вопрос по разработке приложений с использованием паттерна MVVM. А...

Как сделать при нажатии на кнопку (отправлении команды во ViewModel) Cursor.Wait у окна?
Здравствуйте, возникла жуткая потребность, чтобы сделать при нажатии на кнопку (отправлении команды...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru