|
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
|
|||||||||||
Вывод на печать изображения MVVM09.02.2024, 15:47. Показов 5109. Ответов 69
Есть у меня в модели такой вот простой метод:
![]() Добавлено через 23 минуты Не PrintDialog, а PrintVisual я имел ввиду...
0
|
|||||||||||
| 09.02.2024, 15:47 | |
|
Ответы с готовыми решениями:
69
Вывод на печать изображения
|
|
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
|
|
| 09.02.2024, 23:38 [ТС] | |
|
0
|
|
|
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
|
|
| 09.02.2024, 23:42 [ТС] | |
|
Получается и все OpenFileDialog должны из ViewModel вызываться?
Добавлено через 1 минуту Ну я просто не очень понимаю как из View можно вообще что-то вызвать там же просто XAML и все... из Code Behind или как?
0
|
|
|
Модератор
|
||||
| 10.02.2024, 00:04 | ||||
|
Вы имеете ввиду - некое свойство может иметь значения разных типов (или даже одного типа) и View выводит разные представления для разных значений, то это снимает часть противоречий. Например, обычное int свойство со значениями 1, 2, 3. Они отражают состояния Модели: Disconnect, авторизированный и неавторизированный пользователь (гость). View выводит разные представления для каждого значения. Такая реализация правильна. Другой пример. В модели есть списки Страны, Регионы, Города. И для переключения между ними реализовано точно такое же свойство в VM. Вот это уже неправильна реализация. Так изменения представления никак не связано с изменением состояния Модели. И такое переключение должно быть реализовано с помощью навигатора в View. Добавлено через 3 минуты Добавлено через 6 минут А XAML - это язык разметки WPF. Если у вас вьюха это консоль или печатная машинка (я застал и такие), то как здесь поможет XAML? Code Behind, с точки зрения концепции MV* - это такой же код как и XAML. Нет никаких ограничений и тем более запретов на его использование. Такие нюансы - это уже частные детали реализации слоя, которые правилами паттерна не оговариваются.Другое дело, что отказ от Code Behind это "правила хорошего тона" для разработчиков. В том числе, это может быть закреплено "де-юре" в корпоративных правилах.
1
|
||||
|
Модератор
|
|
| 10.02.2024, 09:08 | |
|
Общие вопросы по разделению функционала между слоями вынесены в тему: Разделение функционала между слоями MVVM на примере создания простого WPF приложения с БД
1
|
|
|
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
|
|
| 12.02.2024, 10:35 [ТС] | |
|
Элд Хасп, Правильно я понял, что мне нужно просто сервис написать для PrintDialog и OpenFileDialog, вызывать их в vm и тогда это будет приемлемо?
0
|
|
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
|
| 12.02.2024, 10:49 | |
|
firnen_dragon
В рамках MVVM есть два типа ограничений - технические (категорически не могут нарушаться) и идеологические (тут уже зависит от задачи, ну и вопрос весьма холиварный). Технически, VM-сборка не должна иметь никаких зависимостей от конкретной UI-платформы, т.е. именно на уровне .net-зависимостей. При этом, если нужно реализовать логику показа окна выбора файла или мессаджбокса именно на уровне VM, то да, предоставляете сервис (через интерфейс) и показываете. Реализация и все зависимости при этом остаются во View-слое. А вот идеологически есть два подхода: 1. Вся логика UI размещается во View-слое. 2. Логика UI частично (или максимально) размещается во VM-слое (но всё так же не имеет зависимостей от UI-библиотек). P.S.: что лучше/удобнее - зависит от нюансов проекта.
1
|
|
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
|||
| 12.02.2024, 10:56 | |||
|
kotelok, дополню ответ о
Добавлено через 1 минуту
2
|
|||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 12.02.2024, 11:06 | ||
|
Бизнес-логика приложения (т.е. слой Model) - это в любом случае отдельный проект, который вообще никак не зависит ни от VM, ни от View. Тут никаких вариантов. View и ViewModel да, тоже чисто технически разделяются на отдельные сборки, и сборка ViewModel не имеет никаких зависимостей от UI-платформы (т.е. никаких ссылок на WPF/Avalonia/WinForms/Blazor/итп). Тут тоже никаких вариантов. Однако, открытым остаётся вопрос, какой из слоёв содержит, например, логику отображения мессадж-бокса по какому-то событию (и логику ожидания/обработки ответа пользователя), или же логику навигации между окнами/страницами по действию пользователя - ViewModel или всё же View? Именно логику, не реализацию. Понятно, что реализация отображения MessageBox (или подгрузки контрола) будет где-то во View-слое, т.к. она зависит от конкретной UI-платформы. Но вот откуда этот 'MessageBox' будет вызван? Из code-behind (или ещё какого-то вспомогательного кода) View-слоя, или через интерфейс 'IMessageBox' во ViewModel? Однозначного ответа тут нет. Равно как и где, например, группировать/форматировать данные для отображения - на стороне View, через мультибиндинг-конвертеры на несколько свойств, или всё же на уровне ViewModel, с последующим простым биндингом на одно свойство. Да и даже преобразование какого-нибудь статуса в цвет, которое вроде как интуитивно должно располагаться во View-слое, может быть перенесено в слой ViewModel, без нарушения зависимостей.
1
|
||
|
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
|
||
| 12.02.2024, 11:12 [ТС] | ||
|
kotelok, Я просто одного понять не могу View-слой - это где писать то? Я всегда думал, что к View относится XAML окон, кодбихайнд ну и сервисы, в кодбихайнде писать не желательно, остаются только сервисы и XAML, и вы говорите
0
|
||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 12.02.2024, 11:17 | ||
|
1. В сборке VM у вас в принципе технически не должно быть доступно возможности обратиться к 'OpenFileDialog'. 2. В сборке VM у вас должен быть интерфейс 'IOpenFileDialog' (ну или во вспомогательной сборке, которая тоже ничего про 'OpenFileDialog' не знает). 3. Во View-сборке у вас должна быть реализация 'IOpenFileDialog', которая внутри себя использует 'OpenFileDialog' (или что угодно ещё) и предоставляется во ViewModel-слой через этот самый интерфейс.
1
|
||
|
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
|
|
| 12.02.2024, 11:22 [ТС] | |
|
Все понял, спасибо!
1
|
|
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
||||
| 12.02.2024, 11:35 | ||||
|
Добавлено через 8 минут Тем самым представим что ваш проект состоит из проекта view, есть vm которая является потребителем модели и наследует интерфейсы или же они реализованы в другом\других классах. Если они реализованы в другом\других классах и другом проекте то этот проект вы можете указать и для сервера или другого приложения. То есть ваша данные никак не связаны и вы можете использовать их хоть где по желанию. Я понял примерно это так.
1
|
||||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 12.02.2024, 11:40 | ||
|
1
|
||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
||
| 12.02.2024, 11:46 | ||
|
Добавлено через 2 минуты А привычно реализовывать интерфейсы наследуя их в каком то классе. Репозиторий например, отдельный проект который реализует интерфейс. А в Vm используем этот репозиторий. То есть слой Vm остается чист, он только использует модель
1
|
||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 12.02.2024, 12:22 | ||
|
Ещё во View-слое иногда размещают и всю логику навигации между окнами/страницами (но это от подхода зависит, оно может и во ViewModel быть через абстракции).
2
|
||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
||
| 12.02.2024, 12:34 | ||
|
kotelok, понял, я узко взял о представление view, но про конверторы писал выше.
А вот если в событиях mainwindow работа идет это относится к view, но нарушает mvvm. Пожалуй нарушать что то надо осознанно, зная что такое mvvm или работать только с view. Спасибо всем за дискуссию, было интересно)
1
|
||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 12.02.2024, 12:46 | ||
|
1. Если в событиях окна (в code-behind) обрабатываются события контролов и реализуется какая-то UI-специфичная логика, то не нарушает. 2. Если в обработчике события 'Click' кнопки в code-behind отображается MessageBox (yes/no) и потом производится обращение к команде/методу ViewModel для, например, удаления записи, то тоже не нарушает. 3. А вот если в code-behind появляется логика, которая работает напрямую с моделью, или сама реализует часть логики модели, то тут уже да, эту логику надо опускать либо в Model, либо во ViewModel.
3
|
||
|
Модератор
|
||||
| 12.02.2024, 13:50 | ||||
|
А вот насколько нужно их из VM вызывать - это уже вопрос. Я бы на уровне View всё оставил.
1
|
||||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
|
| 12.02.2024, 13:51 | |
|
kotelok, справедливо
0
|
|
| 12.02.2024, 13:51 | |
|
Вывод на 3D-печать векторного изображения брелка. [MVVM] Вставка изображения в RichTextBox
Печать изображения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
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
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|