Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/55: Рейтинг темы: голосов - 55, средняя оценка - 4.53
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2

Использование Code Behind Окна: допустимо и, если да, то в каких случаях?

17.01.2021, 13:04. Показов 13370. Ответов 167
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тема создана из исходной Генерация имён при генерации элементов

Собственно вопрос данной темы это сообщение:
Цитата Сообщение от kotelok Посмотреть сообщение
Но в некоторых сценариях эта гонка за идеальной архитектурой усложняет код и/или провоцирует перенос логики из View во VM.
Предыдущие посты приведены, чтобы было понятно откуда взялся этот вопрос.

Прошу воспринимать тему не как "Священные войны", а попытку разобраться в этом вопросе, когда на практике не совсем понятна цель "запрета" на использование CB.
Особенно интересует мнение тех кто реально работает программистом в софтверной компании и знает на практики нюансы коллективной, корпоративной работы, проблемы поддержки выпущенного софта.
Возьму на себя смелость специально "пригласить": Usaga, Rius, kolorotur, Рядовой, proa33, novikov.ea, escoult.

Цитата Сообщение от Wiis Посмотреть сообщение
как для каждой пиццы и её элементов генерировать новое имя, если засунуть шаблон в цикл?
Сам шаблон:
Для начала изучить азы WPF.
В WPF есть шаблоны элементов и шаблоны данных.
А то, что вы показали - это чёрт знает, что. Но точно не шаблон.
Шаблоны задаются ИСКЛЮЧИТЕЛЬНО на XAML.
XAML - это основной язык WPF.
Code Behind в WPF не используется. Он должен оставаться пустым.
Вообще забудьте, что он существует и никогда даже не открывайте файлы "*.xaml.cs".
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.01.2021, 13:04
Ответы с готовыми решениями:

В каких случаях допустимо приведение указателей/ссылок на дочерний класс к базовому
В каких случаях допустимо приведение указателей/ссылок на дочерний класс к базовому?

В каких случаях оправданно использование локальных классов?
Здравствуйте. Вопрос: в каких случаях оправданно использование локальных классов? Или когда нужно использовать локальные классы? Какие есть...

Написание GUI руками, без привлечения специализированных фреймворков - нужно ли и если да, то в каких случаях?
Хочется узнать мнение гуру по поводу написания GUI руками.Можно ли реально от этого выиграть в скорости работы программы и как это...

167
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
20.01.2021, 17:13  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Тогда C# есть основной язык разрабртчика WPF, а XAML, - не более чем один из вариантов языка разметки.
Разочарую вас.
XAML был основным языком WPF ещё до того как придумали MVVM....
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
20.01.2021, 22:56
Цитата Сообщение от Элд Хасп Посмотреть сообщение
XAML был основным языком WPF ещё до того как придумали MVVM....
Вы правы. Не смог аккуратно сформулировать свою мысль. XAML больше интерфейс с пользователем и графическое представление ему данных. C# - получение данных, их обработка и, возможно, динамическая модификация XAML.
Лучше на примере. Допустим:
1. Функционал прикладной системы реализован набором UserControl (панелей).
2. Каждый пользователь свои права для работы с приложением - может быть разрешена работа не со всеми панелями.
3. Каждой панели поставлена в соответствие Кнопка и вызов панели осуществляется обработкой события Click.
4. По умолчанию кнопки задаются так (не знаю как задать форматирование XAML):
XML
1
2
3
4
5
6
7
    <Button Name="btc_Группы" HorizontalAlignment="Right" VerticalAlignment="Bottom" Content="Группы" FontWeight="Bold" Click="btc_Группы_Click" Margin="0,0,10,178" Width="128" Height="25" />
    <Button Name="btc_Отделы" HorizontalAlignment="Right" VerticalAlignment="Bottom" Content="Отделы" FontWeight="Bold" Click="btc_Отделы_Click" Margin="0,0,10,150" Width="128" Height="25" />
    <Button Name="btc_СерверыДанных" HorizontalAlignment="Right" VerticalAlignment="Bottom" Content="СерверыДанных" FontWeight="Bold" Click="btc_СерверыДанных_Click" Margin="0,0,10,122" Width="128" Height="25"/>
    <Button Name="btc_ФайлСерверы" HorizontalAlignment="Right" VerticalAlignment="Bottom" Content="ФайлСерверы" FontWeight="Bold" Click="btc_ФайлСерверы_Click" Margin="0,0,10,94" Width="128" Height="25" />
    <Button Name="btc_Пользователи" HorizontalAlignment="Right" VerticalAlignment="Bottom" Content="Пользователи" FontWeight="Bold" Click="btc_Пользователи_Click" Margin="0,0,10,66" Width="128" Height="25" />
    <Button Name="btc_Приложения" HorizontalAlignment="Right" VerticalAlignment="Bottom" Content="Приложения" FontWeight="Bold" Click="btc_Приложения_Click" Margin="0,0,10,38" Width="128" Height="25" />
    <Button Name="btc_ПриПол" HorizontalAlignment="Right" VerticalAlignment="Bottom" Content="ПриПол" FontWeight="Bold" Click="btc_ПриПол_Click" Margin="0,0,10,10" Width="128" Height="25" />
5. При запуске приложения пользователем кнопка не доступной панели невидима и её место занимает кнопка доступной панели. Что реализуется так:
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
    //---------------------------------
    //-- Настройка элементов управления
    //---------------------------------
    private int[] aBtc = new int[7] { //-- смещение элемента по вертикали
     178,    //-- Группы
     150,    //-- Отделы    
     122,    //-- СерверыДанных
      94,    //-- ФайлСерверы
      66,    //-- Пользователи
      38,    //-- Приложения
      10     //-- ПриПол
    };
    private int iBtc; Thickness mBtc;
    
    private void f_НастройкаЭлементовУправления() {
      mBtc = btc_ПриПол.Margin; iBtc = aBtc.Length-1;
      if (f_Права(e_Права.ПриПолПодстановка)) btc_ПриПол.Margin = mBtc; else btc_ПриПол.Visibility = Visibility.Hidden;                       //-- ПриПол доступны?
      if (f_Права(e_Права.ПриложенияПодстановка)) btc_Приложения.Margin = mBtc; else btc_Приложения.Visibility = Visibility.Hidden;           //-- Приложения доступны?
      if (f_Права(e_Права.ПользователиПодстановка)) btc_Пользователи.Margin = mBtc; else btc_Пользователи.Visibility = Visibility.Hidden;     //-- Пользователи доступны?
      if (f_Права(e_Права.ФайлСерверыПодстановка)) btc_ФайлСерверы.Margin = mBtc; else btc_ФайлСерверы.Visibility = Visibility.Hidden;        //-- ФайлСерверы доступны?
      if (f_Права(e_Права.СерверыДанныхПодстановка)) btc_СерверыДанных.Margin = mBtc; else btc_СерверыДанных.Visibility = Visibility.Hidden;  //-- СерверыДанных доступны?
      if (f_Права(e_Права.ОтделыПодстановка)) btc_Отделы.Margin = mBtc; else btc_Отделы.Visibility = Visibility.Hidden;                       //-- Отделы доступны?
      if (f_Права(e_Права.ГруппыПодстановка)) btc_Группы.Margin = mBtc; else btc_Группы.Visibility = Visibility.Hidden;                       //-- Группы доступны?
    }
    private bool f_Права(e_Права i) {
      bool b = null; f1 = бом.Права(i); f2 = бом.Права(i + 1);
      if ((f1 || f2)) { mBtc.Bottom = aBtc[iBtc--]; b = true; }; return b; 
    }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
20.01.2021, 23:33  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Вы правы. Не смог аккуратно сформулировать свою мысль. XAML больше интерфейс с пользователем и графическое представление ему данных. C# - получение данных, их обработка и, возможно, динамическая модификация XAML.
Лучше на примере. Допустим:
Вы можете в WPF вместо C# использовать другие языки без всяких проблем.
Можете на любом языке создать необходимые библиотеки и использовать их в проекте в котором кроме XAML нет ни строчки на другом языке.
Но в любом WPF проекте ОБЯЗАТЕЛЬНО будет XAML - поэтому он и основной язык.
То есть он не заменим для WPF.

Добавлено через 11 минут
Цитата Сообщение от Burlak1951 Посмотреть сообщение
При запуске приложения пользователем кнопка не доступной панели невидима и её место занимает кнопка доступной панели.
Вместо обычной привязки через конвертер BooleanToVisibilityConverter - вы столько намудрили....
Судя по вашему коду и объяснениям, вы просто плохо знаете XAML и другие азы WPF.
Это одна из основных причин рекомендации начинающим "Никогда даже не открывать Code Behind".
К сожалению у нас очень плохо изучают и используют ООП, а говорить за преподавание WPF - даже смысла нет.
Фактически все кто нормально его может использовать - самоучки.

Поверьте, если вы для практике создадите десяток-другой приложений средней руки без использования CB, со всеми финтифлюшками WPF (анимации, триггера, Behavior, AP/DP свойства и т.д.) вам откроется многое о чём вы и не подозревали.
О сколько нам открытий чудных
Готовят просвещенья дух
И опыт, сын ошибок трудных,
И гений, парадоксов друг
A когда НАУЧИТЕСЬ всему этому, тогда уже будете ОСОЗНАНО делать выбор в пользу той или иной реализации.

Добавлено через 5 минут
Цитата Сообщение от Burlak1951 Посмотреть сообщение
XAML больше интерфейс с пользователем и графическое представление ему данных.
Конечно. Так и есть.
WPF (в том числе и XAML) - это инструмент построения Представления, включая не только само отображение данных, но и логику Представления (действия, команды, события, адаптивность и т.д.).
С исходными данными WPF не должна работать.
И если брать целиком WPF Решение, то собственно WPF - это только малая часть (единицы процентов) от кода всего Решения.
В том же WPF обязательно кроме XAML будут использоваться и другие языки, так как на все случаи жизни ни в каких библиотеках заранее готовых типов не хватит.
Часть типов всё равно придётся писать кастомно самому.

Добавлено через 53 секунды
Но использоваться в WPF эти типы потом всё равно должны на XAML.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
21.01.2021, 07:19
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Почему, что не так?
Потому что когда начнете использовать XamarinForms, сразу вспомните про MVVM.
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
21.01.2021, 11:45
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вместо обычной привязки через конвертер BooleanToVisibilityConverter - вы столько намудрили....
Судя по вашему коду и объяснениям, вы просто плохо знаете XAML и другие азы WPF.
Допускаю. Я инженер, а посему вечно что-то не знаю, не умею, не ...Но! люблю учиться и хочу ОСОЗНАНО делать выбор в пользу той или иной реализации.
Только я предпочитаю код сравнивать смысл программного кода, а не художественное бла...бла...бла.
Прстенькая же задача - нужно динамически, в соответствии с правами пользователя для данного приложения, представить ему на MainWindows кнопки выбора функционала - информационных панелей. Панель доступна пользователю, если он может или лицезреть посредством её информацию или редактировать информацию посредством её . Я привел код, Вы рассуждения. Приведите код. Сравним.
Привел в блоге вариант решения задачи устойчивости (слабой зависимости) прикладного приложения по отношению к замене базы данных - источника данных. Привел код решения. Если перед Вами вставала подобная задача, приведите код решения.
В перспективе хочу привести вариант построения прикладного приложения WPF без применения MVVM. Хотелось бы сравнить с подобным.

Добавлено через 9 минут
Цитата Сообщение от Почтальон Посмотреть сообщение
Потому что когда начнете использовать XamarinForms, сразу вспомните про MVVM.
Начинал так: WindowForm как Single Form и множество UserControl. MVVM отсутствовал. Полёт нормальный.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
21.01.2021, 11:46
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Начинал так: WindowForm как Single Form и множество UserControl
Данные хранили в моделе, или тупо в контролах ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
21.01.2021, 12:33  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Только я предпочитаю код сравнивать смысл программного кода, а не художественное бла...бла...бла.
Сравнение всегда субъективно.
Оно происходит по каким-то заранее определённым сравнивающим критериям.
Если мы сравниваем разные реализации задачи для WPF Решения - какие у нас должны быть критерии?

Для начала, что такое WPF? - Это часть платформы Net.
А что такое Net? - Это платформа построена специально для облегчения реализации решении в ООП.
А что такое ООП? - Это концепция программирования направленная на корпоративное, коллективное программирование, помогающая улучшить прозрачность, читаемость кода, его понимание не только для его автора, но и для сторонних программистов, облегчения поддержки приложения после выпуска, его модернизации.
По этой причине ООП - это не только Объекты. Это ещё и ряд дополнительных правил. В первую очередь SOLID.
По этим причинам нельзя по одним критериям сравнивать реализацию на Фортране и Шарпе.
Это концептуально разные языки.
И выбор критериев сравнения уже заранее определяет "победителя".

А как влияет ООП на Решение в целом? В первую очередь, это разделение Решения на отдельные функциональные слои.
Самые распространённые паттерны ООП для Решений - это MVC и MVP.
Поэтому Решение на C# (как и на любом другом Net языке) должно ОБЯЗАТЕЛЬНО реализовывать один из таких паттернов.
Для WPF самым удобным является паттерн MVVM. Он специально создан для облегчения реализации WPF Решений и учитывает особенности WPF.

Главные особенности WPF:
- Наличие специально выделенного свойства для поставки данных (Контекста Данных): DataContext;
- Получение значений элементами через Привязки. По умолчанию источниками привязок служит Контекст Данных;
- Автоадаптивность размеров и размещения элементов в родительском контейнере. По этой причине НЕЛЬЗЯ использовать свойство Margin для позиционирования UI элементов;
- Разделение логики (поведения) и визуальной формы UI элементов. Первое задаётся на вспомогательном языке, второе в шаблоне на XAML;
- Независимые Логические и Визуальные Дерева элементов.

Так же есть ряд второстепенных, но широко используемых в WPF методов, типов: шаблоны данных, стили, триггера, AP/DP свойства, команды, INCC/INPC, конвертеры и др.

Теперь выработаем критерии сравнении для реализации WPF Решений:
1) Код должен быть легко понятен не автору, а другим программистам. В сообществе WPF программистов сложилось определённые правила создания таких реализаций. И создание кода вне этих правил ухудшает его понимание. В том числе, он значительно уменьшает вероятность получения помощи по возникшей проблеме, поскольку "продвинутые" программисты часто помогают в типовых, понятных реализациях, но разбираться в логике горы костылей, вряд ли, захотят.
2) Компоновка UI элементов должна быть адаптивной. Не абсолютно, но хоть в каких-то границах. Иначе нет смысла, вообще, использовать WPF - проще будет воспользоваться Формами.
3) Большая часть кода обращающаяся к UI элементам должна быть реализована на XAML. Использование вспомогательного языка допускается только там где это невозможно реализовать средствами XAML.
4) Обязательно разделяется визуальная часть (представление) и логическая (модель).

Добавлено через 4 минуты
Цитата Сообщение от Почтальон Посмотреть сообщение
Данные хранили в моделе, или тупо в контролах ?
Риторический вопрос?
Ответ очевиден из:
Цитата Сообщение от Burlak1951 Посмотреть сообщение
WindowForm как Single Form и множество UserControl. MVVM отсутствовал. Полёт нормальный.
Добавлено через 4 минуты
Цитата Сообщение от Burlak1951 Посмотреть сообщение
В перспективе хочу привести вариант построения прикладного приложения WPF без применения MVVM. Хотелось бы сравнить с подобным.
Это не "перспектива", а обратное.
1
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
21.01.2021, 13:04
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А что такое ООП? - Это концепция программирования направленная на корпоративное, коллективное программирование, помогающая улучшить прозрачность, читаемость кода, его понимание не только для его автора, но и для сторонних программистов, облегчения поддержки приложения после выпуска, его модернизации.
Немного поправлю. ООП - попытка подвести разработку под предметную область, но никак не для коллективной разработки.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
21.01.2021, 13:07  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Привел в блоге вариант решения задачи устойчивости (слабой зависимости) прикладного приложения по отношению к замене базы данных - источника данных.
Прочитал - это "Изобретение велосипеда".
Есть паттерн Репозиторий (Данных) - он уже давно и широко используется.
Даёт независимость от системы хранения данных.

Добавлено через 2 минуты
Цитата Сообщение от Почтальон Посмотреть сообщение
ООП - попытка подвести разработку под предметную область, но никак не для командной разработки.
Скорее - это две стороны ООП.
Важно и то другое.
"Предметность" я не стал обсуждать, поскольку к вопросу поднятому Burlak1951 это не относится.
1
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
21.01.2021, 13:10
Элд Хасп, а разве если это ООП, обязательно использовать доменную модель ? Можно же и анемичную использовать, кому что удобнее , вот как раз походу Burlak1951 и использует анемичную.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
21.01.2021, 13:17  [ТС]
Цитата Сообщение от Почтальон Посмотреть сообщение
Можно же и анемичную использовать, кому что удобнее
Разве она ещё "жива"?
Была когда-то, но, вроде, от её применения отказались.
Применяют только её "верные адепты".

Тот же VBA, по-моему, представитель анемичной модели.
Но его развитие практически остановилось.

Net в целом всё же нацелен на другую архитектуру приложений.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
21.01.2021, 13:21
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Разве она ещё "жива"?
Ну видимо да, раз люди не слышали про паттерны.
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
21.01.2021, 13:43
Цитата Сообщение от Почтальон Посмотреть сообщение
Данные хранили в моделе, или тупо в контролах ?
Почему тупо? Нужный UserControl подгружается по мере необходимости:
//-- Загрузим новый UserControl
//-- app.ucName содержит имя UserControl
C#
1
2
3
4
5
6
7
8
private void Загрузить() {
  try {
    ucNew = null;
    switch (ucName) {
      case "uc_Группы": ucNew = new uc_Группы(this, oUC); break;
      case "uc_Группы_Фильтр": ucNew = new uc_Группы_Фильтр(this, oUC); break;
      case "uc_Отделы": ucNew = new uc_Отделы(this, oUC); break;
. . .
удаляется также по мере необходимости:
C#
1
2
3
4
5
6
7
8
9
10
11
    //-- Удалим последний и покажем предпоследний UserControl
    public void uc_Удалить() {
      UserControl uc = pop_Стек();
      if (uc != null) grd_Главная.Children.Remove(uc);
      if ((uc = get_Стек()) != null) {
        uc.VerticalAlignment = VerticalAlignment.Bottom; uc.HorizontalAlignment = HorizontalAlignment.Right;
        uc.Margin = new Thickness(0, 0, 0, 0); uc.IsEnabled = true; ((I_Плитка)uc).uc_cmdVisibility(Visibility.Visible);
      }
      else btc_Visibility(Visibility.Visible);
      ucNew = null;
    }
обычно данные сущности хранятся и используются по мере необходимости - в UserControl - так:
C#
1
2
3
4
5
6
namespace ns_Решение {
  public partial class uc_Отделы : UserControl, I_Плитка {
    ObservableCollection<row_Entity> oc_Entity = new ObservableCollection<row_Entity>();  //-- Показываем в DataGrid 
    List<row_Entity> lst_Entity; //-- Временное хранение выборки
    public row_Entity xrow, yrow;
. . .
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
21.01.2021, 14:06
Burlak1951, т.е. для добавление нового контрола, нужно было сделать 100500 правок ? Ну не знаю....даже как это обозвать, рефакторингом бы я точно не занимался. НО только не обижайтесь!
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
21.01.2021, 14:21
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Прочитал - это "Изобретение велосипеда".
Есть паттерн Репозиторий (Данных) - он уже давно и широко используется.
Даёт независимость от системы хранения данных.
Паттерн не дает ни-че-го. Важна реализация. Покажите код Вашей реализации репозитория устойчивости кода прикладного приложения к базам данных. К примеру - базы данных содержат хранимые процедуры. Покажите Ваш работы приложения с параметрами ХП для репозитория.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
21.01.2021, 14:33
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Паттерн не дает ни-че-го. Важна реализация.
Конечно, и я с вами полностью согласен! Но вы же реализовали этот паттерн по-своему. Или вы не знали о репозитории, и решили сделать "свой велосипед" ?
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
21.01.2021, 14:38
Цитата Сообщение от Почтальон Посмотреть сообщение
т.е. для добавление нового контрола, нужно было сделать 100500 правок ?
Почему же? Добавит куда? Если Вы имеете ввиду UserControl, то нужно сделать:
а) Создать новый UC как часть решения.
б) Сделать 5 правок в коде MainWindow приложения
в) Если новый UC вызывается в других UC приложениях, то сделать соответствующие изменения в них
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
21.01.2021, 14:42
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Сделать 5 правок в коде MainWindow приложения
а должна быть одна-две , 5 - это слишком много, я не должен помнить все 5 мест, где это должно правиться. Т.е. временные затраты на поиск ошибки, и ее исправление возрастает в 5 раз. ИМХО
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
21.01.2021, 14:43  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Почему тупо? Нужный UserControl подгружается по мере необходимости:
По этим и подразумевается "тупо".
Для таких задач в WPF используются шаблоны данных и конвертеры.
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
21.01.2021, 14:49
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Обязательно разделяется визуальная часть (представление) и логическая (модель).
Это вот одна из проблем, из-за которой в MVVM (и WPF) сложно погружаться - непонятная и неоднозначная терминология, которую применяют на форумах и в статьях, которая нигде не разжёвывается и в которой, иногда, разные люди что-то своё могут видеть.

Например, визуальная часть ведь тоже содержит свою логическую часть (модель поведения, модель состояния), которая отвечает именно за состояние UI и его реакции на пользователя пользователя или какие-то прочие события. Например, пользователь навёл мышь на элемент и у элемента отрисовалась рамка - это логика визуальной части, которая реализована на XAML при помощи триггеров и стилей. Или пользователь нажал пимпочку и рядом выползло вспомогательное окно с расширенной статистикой, завязанное на ту же VM, это тоже логика UI, которая реализуется в UI-сборке при помощи Behavior или напрямую через XAML.

С моделью, судя по соседней теме, да и в целом, тоже не всё одназначно. В общем случае под этим понимают всё, что лежит ниже VM. Но по факту, там может быть как логика предметной области в виде далёкого API, так и часть логики UI, если это локальная модель, которая нужна для отработки интерактива с пользователем, который на данные не влияет. И мне вот, например, было не очевидно, что так вообще можно делать в плане MVVM-архитектуры, когда часть UI-логики, пусть и косвенно, уползает даже ниже VM.

И, зачастую, ты вроде готов разбираться, читаешь пост, но в ступоре, т.к. не понимаешь, что вообще человек имел ввиду, какую именно терминологию применял и как её понимает (речь не конкретных элементах/классах/синтаксисе XAML, речь именно про архитектурную терминологию).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.01.2021, 14:49

В каких случаях использовать обращение self::, а в каких $this. В чём разница между ними?
Привет! Сейчас пишу регистрацию в стиле ооп. Пишу функцию __construct в классе Registration class Registration{ protected $Name; ...

В каких случаях уместно применять F-критерий, а в каких - эмпирическое корреляционное отношение?
Дисперсионный анализ Доброго времени суток! Подскажите, пожалуйста, в каких случаях уместно применять F-критерий, а в каких -...

В каких случаях нужно создавать динамические переменные, а в каких статические?
такой же вопрос и по массивам ! Объясните пожалуйста !

В каких случаях нужно использовать подключаемый уровень, а в каких автономный
Добрый день. Изучаю материал по работе с ADO.NET и у меня возник такой вопрос: 1.- В каких случаях нужно использовать подключаемый...

В каких случаях надо создавать индексы к полям, а в каких - нет?
Не могу понять, в каком случае надо создовать индексы к полям а вкаких нет. если надо, то в каком случае индекс надо создать для каждого...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru