Аватар для Sigin
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808

Использование диалогов в MVVM паттерне

17.11.2015, 13:11. Показов 3307. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно к какой части модели относится диалог? View или ViewModel? И как лучше реализовать? Что можно почитать (а лучше посмотреть реальные проекты), чтобы в будующем таких вопросов не было?

Добавлено через 3 часа 11 минут
Ладно, хорошо, допустим я реализовал диалог выбора файла. Вот моя 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
public class MainViewModel : ViewModelBase
    {
        private string _selectedPath;
        public string SelectedPath
        {
            get { return _selectedPath; }
            set
            {
                if (Set(ref _selectedPath, value))
                    SelectFileCommand.RaiseCanExecuteChanged();
            }
        }
        public RelayCommand SelectFileCommand { get; private set; }
        public MainViewModel()
        {
            InitiailizeCommands();
        }
        private void InitiailizeCommands()
        {
            SelectFileCommand = new RelayCommand(SelectFile, () => !File.Exists(SelectedPath));
        }
        private void SelectFile()
        {
            var dialog = new OpenFileDialog();
            dialog.ShowDialog();
            SelectedPath = dialog.FileName;
        }
    }
Вот View:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Window x:Class="Brute_force.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:viewModel="clr-namespace:Brute_force.ViewModel"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <viewModel:MainViewModel />
    </Window.DataContext>
    <Grid>
        <Button x:Name="Button" Command="{Binding SelectFileCommand}" Content="Button" HorizontalAlignment="Left" Margin="34,44,0,0" VerticalAlignment="Top" Width="75"/>
        <TextBox x:Name="TextBox" Text="{Binding SelectedPath}" HorizontalAlignment="Left" Height="23" Margin="140,44,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    </Grid>
</Window>
На сколько это правильно относительно используемого паттерна?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.11.2015, 13:11
Ответы с готовыми решениями:

Использование стандартных классов в качесве Модели в паттерне MVVM
Добрый день. Моя программа должна работать с каталогами. Суть такова, в каталоге есть много других каталогов, их необходимо...

Создание интерфейса в паттерне MVVM
Доброго времени суток, есть вопрос: разрабатываю приложение с помощью данного паттерна и получается так, что в приложении в разных частях...

Открытие второй формы в mvvm паттерне
Вообщем, открываю вторую форму кодом. Вопрос, как закрыть первую? Пример смотрел отсюда, но что-то он меня не сильнов впечатляет. ...

6
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10422 / 5152 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
17.11.2015, 13:41
Цитата Сообщение от nestquik2 Посмотреть сообщение
На сколько это правильно относительно используемого паттерна?
Неправильно, поскольку ViewModel не должна привязываться к элементам представления (т.е. View). У вас же получается что ViewModel привязана к виндовому окошку, которое эта модель открывает. А если эта ViewModel будет работать на ASP сервере, то кому она будет это окошко показывать? Админу?
Кроме того, такой код лишает вас возможности автоматического тестирования ViewModel, поскольку она будет запрашивать пользовательских действий.
Решение - создать отдельный интерфейс IOpenFileDialog, и создать объект с дефолтной реализацией этого интерфейса (которая будет открывать виндовый OpenFileDialog). В VM вы будете дергать методы из IOpenFileDialog. Если работа будет на веб-сервере, то можно реализовать отдельную реализацию IOpenFileDialog, которая будет спрашивать имя файла у веб-пользователя. Если будет тестирование - то можно сделать отдельную реализацию-заглушку, которая вообще не будет ничего спрашивать а просто вернет какой-то дефолтный файл.
0
Жуткая тВарЬ
393 / 328 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
17.11.2015, 13:59
nestquik2, Если чуть чуть поправить Storm23, то Ваша ViewModel должна пользоваться неким сервисов, который предоставит НЕ ФАЙЛ, а ИНФОРМАЦИЮ (например поток данных) - сервис должен быть реализован через интерфейс, о чем уже написал Storm23....А вот класс который реализует этот интерфейс уже может использовать, что угодно, хоть OpenFileDialog, хоть свой специфический контрол....
При таком подходе ViewModel получает некоторую зависимость в виде ИНТЕРФЕЙСА, которую можно подменять на разные реализации как угодно и где угодно в зависимости от того где приложение работает

Добавлено через 1 минуту
Для управления зависимостями надо бы познакомиться с IoC контейнерами, но это вообще то уже не mvvm...
0
Заблокирован
17.11.2015, 14:11
Цитата Сообщение от nestquik2 Посмотреть сообщение
XML
1
xmlns:viewModel="clr-namespace:Brute_force.ViewModel"
1
 Аватар для Sigin
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
17.11.2015, 15:40  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
создать отдельный интерфейс IOpenFileDialog
C#
1
2
3
4
public interface IOpenFileDialog
    {
        string OpenFileDialog(string defaultPath);
    }
Цитата Сообщение от Storm23 Посмотреть сообщение
создать объект с дефолтной реализацией этого интерфейса (которая будет открывать виндовый OpenFileDialog)
C#
1
2
3
4
5
6
7
8
9
class MyOpenFileDialog : IOpenFileDialog
    {
        public string OpenFileDialog(string defaultPath)
        {
            var dialog = new OpenFileDialog {InitialDirectory = defaultPath};
            dialog.ShowDialog();
            return dialog.FileName??string.Empty;
        }
    }
Цитата Сообщение от Storm23 Посмотреть сообщение
В VM вы будете дергать методы из IOpenFileDialog
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
public class MainViewModel : ViewModelBase
    {
        private string _selectedPath;
        public string SelectedPath
        {
            get { return _selectedPath; }
            set
            {
                if (Set(ref _selectedPath, value))
                    SelectFileCommand.RaiseCanExecuteChanged();
            }
        }
        private readonly IOpenFileDialog _openFileDialog;
        public RelayCommand SelectFileCommand { get; private set; }
        public MainViewModel(IOpenFileDialog openFileDialog)
        {
            _openFileDialog = openFileDialog;
            InitiailizeCommands();
        }
        private void InitiailizeCommands()
        {
            SelectFileCommand = new RelayCommand(SelectFile, () => !File.Exists(SelectedPath));
        }
        private void SelectFile()
        {
            SelectedPath = _openFileDialog.OpenFileDialog(App.Root);
        }
    }
View:
C#
1
2
3
4
5
6
7
8
9
10
public partial class MainWindow
    {
        private readonly MainViewModel _main;
        public MainWindow()
        {
            InitializeComponent();
            _main = new MainViewModel(new MyOpenFileDialog());
            DataContext = _main;
        }
    }
Вроде все верно? Если нам понадобится выбрать несколько файлов написать в интерфейсе еще один метод для получения выбранных файлов, и реализовать этот метод в MyOpenFileDialog?

Не по теме:

Ev_Hyper, ну подумаешь название такое :p



Ладно решил особо не запариватся и взял готовое решение MvvmDialogs

Добавлено через 34 минуты
И еще один вопрос: если понадобится локализовать Title этого самого OpenDialog, то как быть? По сути локализация это же чисто View...
1
Жуткая тВарЬ
393 / 328 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
17.11.2015, 15:49
Цитата Сообщение от nestquik2 Посмотреть сообщение
И еще один вопрос: если понадобится локализовать Title этого самого OpenDialog, то как быть? По сути локализация это же чисто View...
Гляньте в сторону Aero Framework http://habrahabr.ru/post/251347/ там есть тема локализации и на мой взгляд решение этой проблемы в наддом фреймворке наиболее удачное
1
 Аватар для Sigin
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
17.11.2015, 16:35  [ТС]
amarf, тяжело без опыта в такое лезть... Мне допустим надо просто локализовать это (в методе SelectFiles):
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
using System;
using System.IO;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using MvvmDialogs;
using MvvmDialogs.FrameworkDialogs.OpenFile;
namespace Brute_force.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        private string _selectedPath;
        public string SelectedPath
        {
            get { return _selectedPath; }
            set
            {
                if (Set(ref _selectedPath, value))
                    SelectFilesCommand.RaiseCanExecuteChanged();
            }
        }
        private readonly IDialogService _dialogService;
        public RelayCommand SelectFilesCommand { get; private set; }
        public MainViewModel(IDialogService dialogService)
        {
            _dialogService = dialogService;
            InitiailizeCommands();
        }
        private void InitiailizeCommands()
        {
            SelectFilesCommand = new RelayCommand(SelectFiles, () => !File.Exists(SelectedPath));
        }
        private void SelectFiles()
        {
            var settings = new OpenFileDialogSettings
            {
------------>Title = "This Is The Title",
                InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),
                Filter = "Text Documents (*.txt)|*.txt",
                Multiselect = true
            };
            var success = _dialogService.ShowOpenFileDialog(this, settings);
            if (success == true)
                SelectedPath = settings.FileNames[0];
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2015, 16:35
Помогаю со студенческими работами здесь

Хранение и использование в игре диалогов
Здравствуйте! Пишем с другом простейшую игру, проблема такая: Как лучше хранить и использовать диалоги в игре? Диалоги имеют от 1 до 3...

В ВК, при просмотре диалогов, либо чтении стен групп резко увеличивается использование ОЗУ браузером Chrome
как это объяснить - глюк происходит только в ВК, при просмотре диалогов, либо чтении стен групп. 200-400к в обычном состоянии и тут вдруг...

Использование mvvm
Уже достаточно давно разбираюсь с сабжем (конкретно Prism 4) и все больше меня занимает вопрос - зачем оно все надо? С одной стороны все...

Использование MVVM + Entity Framework
Добрый вечер! Хотел бы понять как работать по паттерну MVVM в связке с entity, есть некая проблема использовать для модели сущности entity...

Использование EntityFramework в шаблоне MVVM
Недавно начал изучать шаблон MVVM и хотел бы узнать правильно ли я делаю, или нужно как-то иначе (пока команды не использую, это сейчас не...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
Тестирование Pull Request в Kubernetes с vCluster
Mr. Docker 19.07.2025
Часто сталкиваюсь с серьезной дилемой при настройке тестовых окружений для проверки Pull Request в Kubernetes. С одной стороны, каждый PR требует изолированной среды — только так можно гарантировать,. . .
Мой 7 минутный ролик с крамольным предложением про шахматы, предлагаю заценить
_Ivana 18.07.2025
p2UhJNMGY94
Десять Middleware Node.js для эффективного кодинга
Reangularity 18.07.2025
Когда я только начинал работать с Node. js, количество пакетов в npm меня буквально парализовало. Сегодня их больше 1,3 миллиона — попробуй разберись, что стоит твоего внимания, а что нет. Я потратил. . .
Context и глубины Android
mobDevWorks 18.07.2025
В Android разработки Context напоминает воздух - он везде, жизненно необходим, но мало кто может детально объяснить его природу. Мы привыкли получать его как параметр, передавать дальше и. . .
Результаты исследования от команды MCM (июль 2025 г.)
Programma_Boinc 18.07.2025
Результаты исследования от команды MCM (июль 2025 г. ) Как сообщалось в наших предыдущих публикациях, мы изучаем гены, которые имеют наибольший рейтинг и ассоциируются с различными видами рака, в. . .
ИИ-чатбот на React с OpenAI и LangChain.js
Reangularity 17.07.2025
React давно стал для меня золотым стандартом фронтенд-разработки. Его компонентная структура, виртуальный DOM и однонаправленный поток данных идеально подходят для создания динамичных интерфейсов. . .
Пишем адаптер для локального хранилища S3 на C#
stackOverflow 16.07.2025
Разработка современных приложений часто требует интеграции с объектными хранилищами, и Amazon S3 стал де-факто стандартом в этой области. Однако работа с облачными сервисами в процессе разработки. . .
Старые замки
kumehtar 16.07.2025
Смотрел тут фото, попались пара старых замков. И сразу бросилось в глаза из отличие. Например: Замок Бистон, в англии. Разрушенное сооружение. Но - не испорченное людьми, по крайней мере - на. . .
Java и Eclipse Store: Сверхбыстрые приложения с In-Memory DB
Javaican 15.07.2025
Eclipse Store — это микро-движок персистентности для Java, который позволяет хранить и извлекать нативные Java-объекты без необходимости преобразования данных или использования объектно-реляционного. . .
EmBitz, создание проекта, отладка, прошивка
locm 15.07.2025
Создание проекта для Blue Pill (STM32F103C8T6) в EmBitz 2. 30, написания кода blink, запуск отладки в ОЗУ, заливка релизной прошивки во flash используя ST-Link и др. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru