Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175

Разделение функционала между слоями MVVM на примере создания простого WPF приложения с БД

10.02.2024, 00:12. Показов 8829. Ответов 182
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тема создана разделением темы Вывод на печать изображения MVVM


Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы имеете - некое свойство может иметь значения разных типов (или даже одного типа) и View выводит разные представления для разных значений, то это снимает часть противоречий.
Да про это. например в
XML
1
 <ContentControl Grid.Column="1" Content="{Binding CurrentView}"></ContentControl>
идет привязка к свойству CurrentView, оно же изменяется при переключение RadioButton. То есть от выбранного RadioButton зависит какой контент будет у ContentControl. Получается что представление очень зависимо от свойства CurrentView.

Кликните здесь для просмотра всего текста
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
72
73
74
75
76
77
78
public class MainWindowVM : ViewModelBase
    {
        public MainWindowVM()
        {
            //Создаём команды
            OpenUserControl1Command = new RelayCommand(OpenUserControl1);
            OpenUserControl2Command = new RelayCommand(OpenUserControl2);
            OpenUserControl3Command = new RelayCommand(OpenUserControl3);
 
            OpenOtherControlCommand = new RelayCommand(OpenOtherControlCommandExecute);
        }
        #region открытие user control
        private object _popupCurrentView;
 
        public object PopupCurrentView
        {
            get => _popupCurrentView;
            set
            {
                _popupCurrentView = value;
                OnPropertyChanged(nameof(PopupCurrentView));
            }
        }
        public ICommand OpenOtherControlCommand { get; private set; }
        public void OpenOtherControlCommandExecute(object obj) => PopupCurrentView = new SelectLangue();
 
        public ICommand CloseOtherControlCommand { get; private set; }
        public void CloseOtherControlCommandExecute(object obj) => PopupCurrentView = null;
        #endregion
 
        private object _currentView;
 
        /// <summary>
        /// ListcurrentView нужен для хранения состояния UserControl. 
        /// Все действия над представлением и изменением контента сохраняются в этой коллекции. 
        /// Если хранить  представление и изменением контента не нужно. Тогда лучше удалить эту коллекцию и связанный с ней метод.
        /// </summary>
        private List<UserControl> ListcurrentView = new();
 
        /// <summary>
        /// Отображание текущего UserContol в ContentControl в окне MainWindow
        /// </summary>
        public object CurrentView
        {
            get => _currentView;
            set
            {
                _currentView = value;
                OnPropertyChanged(nameof(CurrentView));
            }
        }
        #region Команды для отображения UserControl в окне MainWindow
        public ICommand OpenUserControl1Command { get; }
        private void OpenUserControl1(object obj) => CurrentView = GetOrAddUserControl<UserControl1>();
 
        public ICommand OpenUserControl2Command { get; }
        private void OpenUserControl2(object obj) => CurrentView = GetOrAddUserControl<UserControl2>();
 
        public ICommand OpenUserControl3Command { get; }
        private void OpenUserControl3(object obj) => CurrentView = GetOrAddUserControl<UserControl3>();
 
        /// <summary>
        /// Универсальный метод для возвращения UserControl из коллекции
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        private UserControl GetOrAddUserControl<T>() where T : UserControl, new()
        {
            var control = ListcurrentView.Find(c => c.GetType() == typeof(T));
            if (control == null)
            {
                control = new T();
                ListcurrentView.Add(control);
            }
            return control;
        }
        #endregion
    }


Цитата Сообщение от Элд Хасп Посмотреть сообщение
И такое переключение должно быть реализовано с помощью навигатора в View.
Использование сервисов, чтобы узнать об изменение View?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2024, 00:12
Ответы с готовыми решениями:

ASP.NET MVC - разделение функционала между различными view
Добрый день)) Хочу спросить совета. В своем проекте использую MVC + jQuery, чтобы создать функционал в системе, аналогичный тому, что...

WPF MVVM: варианты создания VM с параметрами
Есть обычная ViewModel: public class SomeViewModel { private readonly ILogger logger; private readonly...

WPF нюансы создания проводника и мелочи по MVVM
Здравствуйте. Я только начинаю осваивать WPF и паттерн MVVM, и вот в чём загвостка: 1) Я уже написал визуальное оформление приложения и...

182
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
12.02.2024, 08:13  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А нужен ли тогда в интерфейсе Модели репозиторий юзеров?
В целом ради чтения одной записи не сильно то и нужен.... Для галочки если только.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,170
Записей в блоге: 2
12.02.2024, 08:50
Цитата Сообщение от xellan24rus Посмотреть сообщение
Для галочки если только.
Лучше убрать тогда.
Для этого будет достаточно членов авторизации.
И кроме них два репозитория: людей и товаров.
Как я понял, по бизнес-логике список людей неизменяем. А товаров мутабельный. Верно?

Добавлено через 10 минут
Если да, то можно изменить интерфейсы.
Вариант 1
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public interface IRepository<T>
    {
        ReadOnlyObservableCollection<T> GetCollection();
        bool Delete(int id);
        T Clone(T t);
        T? Add(T t);
        T? Update(T t);
 
        /// <summary>Если <see langword="true"/>,
        /// то методы <see cref="Delete"/>, <see cref="Add(T)"/> и
        /// <see cref="Update(T)"/> не работают.
        /// При их вызове будет выкидываться исключение.</summary>
        bool IsReadOnly {  get; }   
    }
Вариант 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
    public interface IRepository<T> : IReadOnlyRepository<T>
    {
        new ReadOnlyObservableCollection<T> GetCollection();
        bool Delete(int id);
        T Clone(T t);
        T? Add(T t);
        T? Update(T t);
    }
    public interface IReadOnlyRepository<T>
    {
        IEnumerable<T> GetCollection();
    }
Добавлено через 54 секунды
Во втором варианте репозиторий людей реализует только IReadOnlyRepository, а репозиторий товаров IRepository.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
12.02.2024, 08:52  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Лучше убрать тогда.
Хорошо.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для этого будет достаточно членов авторизации.
С дефолтными средствами не приходилось работать. Бд, json, xml и прочее для файловой системы.
Если вы про что то из средств мсдн для авторизации, то я сейчас вас не пойму, и в этом случае, если это нужно сделать, то можно ссылку на мсдн что будем использовать, изучу\добавлю.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И кроме них два репозитория: людей и товаров.
Пока что да, думаю больше ничего не будем добавлять для работы с бд.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Как я понял, по бизнес-логике список людей неизменяем.
Верно.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А товаров мутабельный. Верно?
Просто описание и название, пример редактирования во view, то есть базовые задачи.

Если делать что то мутабельное, то лучше занять еще одну страницу меню, и там уже в datagrid выводить мутабельную коллекцию, делать фильтры. Но с этим думаю позже решим, пока что текущее сделать. А потом обновить решение.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,170
Записей в блоге: 2
12.02.2024, 08:54
P.S. Синхронизация GIT-репозиториев.
Только увидел.
Вы похоже изменения вносили не в свою, а в мою ветку.
Поэтому произошло переплетение фиксаций.
Проконтролируйте этот момент, а то уже не понятно что в какой ветке за что отвечает.

Добавлено через 1 минуту
Цитата Сообщение от xellan24rus Посмотреть сообщение
Если вы про что то из средств мсдн для авторизации, то я сейчас вас не пойму,
Не,.... имею ввиду члены авторизации нашего интерфейса.
Раз мы добавили нормальную поддержку авторизации, то необходимости в репозитории юзеров. Только с толку будет сбивать.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
12.02.2024, 09:50  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Проконтролируйте этот момент, а то уже не понятно что в какой ветке за что отвечает.
Да я хотел синхронизировать, но вышло сплетение веток в вашу. Извиняюсь за не удобства в вашей ветке, а так синхронизировать вас с моей веткой не понял.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Раз мы добавили нормальную поддержку авторизации, то необходимости в репозитории юзеров. Только с толку будет сбивать.
Вот тут не понял.

Добавлено через 48 секунд
Элд Хасп, если у вас нет бекапа, скорее всего есть. То перед пробой я скачал вашу ветку в качестве бекапа, на всякий случай.
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
12.02.2024, 09:56
Цитата Сообщение от xellan24rus Посмотреть сообщение
а так синхронизировать вас с моей веткой не понял
Предварительно закоммитить всё в своё ветке, далее:
Code
1
2
3
4
5
git checkout one
git pull
git checkout two
git pull
git merge one
В итоге по 'merge' будет предпринята попытка добавить все изменения из ветки 'one' в ветку 'two'. Если будут неразрешимые конфликты, то:
Code
1
2
3
<вручную разрешить конфликты>
git add <конфликтные файлы>
git commit -m"Разрешение конфликтов (ну или какой-то свой комментарий)."
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
12.02.2024, 10:13  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если да, то можно изменить интерфейсы.
Вариант 1
Вариант 1 кажется получше, хотя суть одинаковая. Пока что эту логику сделаем, чтобы было настроено всё, чтобы не охватывать лишнее и не было путаницы. А позже можно подумать о то что мутабельное добавить. Сейчас мой пример в гит сильно отличается от вашего, мне нужно сравнять код с вашим примером и понять ваш уровень работы, чтобы что то новое делать. Так как копипаст меня не интересует, в рамках учебного примера, я практикую. Вы показали как сделать лучше, в своем репозитории я должен реализовать такой же функционал, разобраться как устроено)

Добавлено через 1 минуту
kotelok, как нибудь попробую спасибо) А десткопной версией, почему то ей никто не пользуется... Хотя мне кажется удобно было бы управлять репозиторием ею

Добавлено через 8 минут
Цитата Сообщение от kotelok Посмотреть сообщение
В итоге по 'merge' будет предпринята попытка добавить все изменения из ветки 'one' в ветку 'two'. Если будут неразрешимые конфликты, то:
Это же слияние веток, я так и сделал. Ветка два стала веткой один... Так как у нас разная реализация была многих файлов и части view и vm. Я понял что я сделал слияние полным, а не заменил только что нужно. Пожалуй чтобы делать слияние, нужно работать каждому с чем то то одним. Если охват идет на весь проект, и идут разные зависимости во всем проекте, то сделать слияние проблематично. Мне кажется так.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,170
Записей в блоге: 2
12.02.2024, 10:27
Цитата Сообщение от xellan24rus Посмотреть сообщение
то сделать слияние проблематично. Мне кажется так.
Да.
Я свою ветку делал не как развитие, дополнение вашей, а как примеры реализацией. Поэтому не рассчитывал и не предусматривал их слияние.
Так же перед слиянием, в любом случае, лучше делать ревизию обоих веток. Особенно когда у них разная архитектура. В наших ветках, даже проекты были разные и с другими именами.

Добавлено через 3 минуты
Цитата Сообщение от xellan24rus Посмотреть сообщение
Вот тут не понял.
Для потребителей Модели не важно как реализована авторизация. Через БД, файл, настройки или иным образом. Репозиторий юзеров, в таком случае, этой частная деталь это реализации и потребителям модели об этом знать не нужно.
Поэтому этот репозиторий надо удалить из интерфейса Модели. И даже если он нужен ей, то создавать его в приватном или include поле/свойстве.

Добавлено через 3 минуты
Цитата Сообщение от xellan24rus Посмотреть сообщение
То перед пробой я скачал вашу ветку в качестве бекапа, на всякий случай.
Это не проблема.
В этом одна из "прелестей" репозитория - можно откатить на любую точку фиксации. И начать опять с неё.
Я бы уже это сделал.
Но вам нужно сначала привести в порядку свою ветку "main", а то так и будем прыгать с фиксации на фиксацию с мильоном слияний.
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
12.02.2024, 10:27
Цитата Сообщение от xellan24rus Посмотреть сообщение
как нибудь попробую спасибо
Создаёте локальный репозиторий с парой тектстовых файлов и экспериментируете.

А на живом проекте, если есть сомнения, то перед манипуляциями с гитом просто делаете 'ctrl+c, ctrl+v' целиком на всём каталоге проекта (т.е. вместе с исходниками и каталогом .git), чтобы если что, можно было бы легко откатить вашу локальную копию репозитория.

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

Цитата Сообщение от xellan24rus Посмотреть сообщение
Ветка два стала веткой один
Не. Ветки остаются сами по себе. Просто изменения из одной ветки сливаются в другую. Ну да, если всё ок, они временно начинают указывать на одну точку, но ветки всё равно разные остаются.

Цитата Сообщение от xellan24rus Посмотреть сообщение
Пожалуй чтобы делать слияние, нужно работать каждому с чем то то одним
Надо, чтобы не пересекались изменения в одних и тех же файлах. Но даже в случае таких конфликтов, гит иногда справляется с автоматическим слиянием.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,170
Записей в блоге: 2
12.02.2024, 10:32
Цитата Сообщение от xellan24rus Посмотреть сообщение
Вариант 1 кажется получше, хотя суть одинаковая.
Суть одинаковая, но логика потребителей должна быть разной.
Вариант с IsReadOnly требует от потребителей обязательной проверки этого свойства перед обращением к методам интерфейса.
Вариант с базовым интерфейсом позволит создавать репы в которых просто нет этих методов, и потребителям не будет необходимости в доп проверках.

Я бы напротив, предпочёл вариант с базовым интерфейсам.
А вариант с IsReadOnly оставил бы для репозиториев в которых этот флаг может меняться динамически.
Например, репозиторий один, но есть потребители (юзеры) с разными ролями.
Если роль гостевая, то IsReadOnly=true, если с полным доступом, то false.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
12.02.2024, 12:15  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для потребителей Модели не важно как реализована авторизация. Через БД, файл, настройки или иным образом. Репозиторий юзеров, в таком случае, этой частная деталь это реализации и потребителям модели об этом знать не нужно.
Поэтому этот репозиторий надо удалить из интерфейса Модели. И даже если он нужен ей, то создавать его в приватном или include поле/свойстве.
Поддерживаю, есть модель, сделать отдельный класс для работы и этого будет достаточно.

Добавлено через 7 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это не проблема.
В этом одна из "прелестей" репозитория - можно откатить на любую точку фиксации. И начать опять с неё.
Я бы уже это сделал.
Отлично тогда, не сломал проект хоть..
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но вам нужно сначала привести в порядку свою ветку "main", а то так и будем прыгать с фиксации на фиксацию с мильоном слияний.
Тогда мне остается привести свою ветку в порядок и заменить ею вашу. Так как сейчас моя сильно отличается не только кодом, но и view частью. То есть абсолютно иная ветка. И после того как это сделано будет, можно будет думать уже о слияние.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я бы напротив, предпочёл вариант с базовым интерфейсам.
Для текущего примера только это и нужно, ведь IsReadOnly будет в этом примере бесполезен. Потому что войти может только пользователь, не гость.

Добавлено через 5 минут
Цитата Сообщение от kotelok Посмотреть сообщение
И иногда в следующей версии UI могут сильно поменять.
Так вот почему кто то использует команды, а не ui.
Цитата Сообщение от kotelok Посмотреть сообщение
Надо, чтобы не пересекались изменения в одних и тех же файлах. Но даже в случае таких конфликтов, гит иногда справляется с автоматическим слиянием.
Но в идеале конечно чтобы изменения в файлах не пересекались, тогда слияние будет хорошим. А надеяться на автозамену гит в самих файлах не надежно.
Цитата Сообщение от kotelok Посмотреть сообщение
Создаёте локальный репозиторий с парой тектстовых файлов и экспериментируете.
А на живом проекте, если есть сомнения, то перед манипуляциями с гитом просто делаете 'ctrl+c, ctrl+v' целиком на всём каталоге проекта (т.е. вместе с исходниками и каталогом .git), чтобы если что, можно было бы легко откатить вашу локальную копию репозитория.
Понял спасибо. Как вариант сделать ветки и делать слияние. Но суть я понял, лучше чтобы только разница в файлах была. И не было частей где код может переплестись, если в файл одной ветки отличается полностью от другого.

Добавлено через 1 час 25 минут
Элд Хасп, можете свою ветку перезалить, сейчас там наши обе, слишком много не нужного. А с учетом существующих правок ваших, архивная ветка, наверное не содержит новый код
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,170
Записей в блоге: 2
12.02.2024, 14:00
Цитата Сообщение от xellan24rus Посмотреть сообщение
можете свою ветку перезалить,
Вечером.
С работы не могу.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
12.02.2024, 14:07  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вечером.
С работы не могу.
Хорошо, я тут подумал на счёт разделения слоёв. По использованию понял что это всё не зависит друг от друга. И что актуально в либе делать DTO, интерфейсы и реализацию интерфейсов так как это всё может использоваться комплексно только, в решение. Но пример для того и есть чтобы понять. Не понять пока каждый слой не отделишь)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,170
Записей в блоге: 2
12.02.2024, 14:31
Цитата Сообщение от xellan24rus Посмотреть сообщение
И что актуально в либе делать DTO, интерфейсы и реализацию интерфейсов
Реализацию интерфейсов обычно делают в слое, если это не обобщённая реализация, которую может использовать любой слой.
Типичный пример такой реализации это BaseInpc отсюда: Простые реализации для тем на форуме
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
12.02.2024, 14:48  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Реализацию интерфейсов обычно делают в слое, если это не обобщённая реализация, которую может использовать любой слой.
Я тоже так подумал. Но в этом примере дальше продолжаю дробить каждый слой на новый проект, так сказать в пример того что это может сосуществовать вне решения, в данный момент меня преследует эта цель. По возможности закончу и обновлю гит, тогда уже сможем попробовать синхронизироваться, да и решение будет у обоих одинаковое, проще разобраться где что. Так как сейчас у нет почти ничего общего.

Добавлено через 29 секунд
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Типичный пример такой реализации это BaseInpc отсюда: Простые реализации для тем на форуме
Тут уже может использоваться хоть где, универсальное решение
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,170
Записей в блоге: 2
12.02.2024, 15:12
Цитата Сообщение от xellan24rus Посмотреть сообщение
универсальное решение
Да.
Я поэтому его и не назвал ViewModelBase.
Для базового класса VM у меня есть более тяжёлая реализация с интеграцией словарей значений свойств, с созданием команд и их подпиской.
Зато использовать его проще чем BaseInpc. А чуть увеличенные задержки всё равно, по сравнению с задержками в GUI, никакими тестами не выявишь.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
12.02.2024, 15:53  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для базового класса VM у меня есть более тяжёлая реализация с интеграцией словарей значений свойств, с созданием команд и их подпиской.
Зато использовать его проще чем BaseInpc. А чуть увеличенные задержки всё равно, по сравнению с задержками в GUI, никакими тестами не выявишь.
Звучит хорошо, что то вроде Fody, или PostSharp сделали?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,170
Записей в блоге: 2
12.02.2024, 17:34
Цитата Сообщение от xellan24rus Посмотреть сообщение
что то вроде Fody, или PostSharp сделали?
Не....
Попроще.
Цель же моя чтобы в обучении можно было использовать.
Закину в репозиторий реализацию.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
12.02.2024, 18:04  [ТС]
фвс
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Цель же моя чтобы в обучении можно было использовать.
Закину в репозиторий реализацию.
Спасибо) Посмотрю что там заодно)
Кстати какую версию ef вы используете?
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
12.02.2024, 18:04  [ТС]
В бд данные есть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2024, 18:04

Структура WPF приложения на MVVM
Здравствуйте. Разрабатываю приложение на WPF. Использую шаблон MVVM. В представлении контент сгруппирован по вкладкам TabControl. ...

Пример реализации WPF+MVVM приложения
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html Пример решения ТЗ по теме...

Паттерн MVVM или как писать приложения на WPF
Собтвенно вопрос в заголовке. По-скольку WPF поддерживает привязку различным образом наверно это нужно как-то использовать, а не просто как...

Kivy для создания простого приложения
Всем привет ,я делаю простую программу на python, но никак не могу решить 2 проблемы. 1) Никак не меняется фон ModalView, хотя уже все...

Пример переключения между окнами WPF MVVM
Здравствуйте. Изучаю как можно переходить между окнами в wpf в рамках MVVM. Изучаю данный пример: ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru