|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Везде пишут через какие-то сервисы. А как вам такой вариант? http://stackoverflow.com/a/21851139/808128 Значит, у меня это выглядит так Вью: Код: xml 1.
Код: xml 1. 2. 3. 4. 5. 6. 7. 8.
Код: xml 1. 2. 3.
Коде бихайнд для вью: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Ну и в модели представления свойство, естественно Код: c# 1. 2. 3. 4. 5.
Проверил вью модел под дебагом, когда выбрал файл - она получает полный путь к файл, как и надо. Как это оцениваете? Как костыли, или нормально? Подход со всякими сервисами и "разрешениями контейнеров инжекций зависимостей" - не костыли? АлексейК, ты же, вроде, за "понерфить MVVM". Как относишься к предложенному подходу? Или тоже за сервисы? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2015, 17:41 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Только тут TargetType="local: MyView " и тут public static readonly DependencyProperty FilePathProperty = DependencyProperty.Register( "FilePath", typeof(string), typeof( Common_V )); один тип надо написать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2015, 17:43 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Alexey2112Ну и в модели представления свойство, естественно Естественно, с INotifyPropertyChanged. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2015, 17:44 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Alexey2112Alexey2112Ну и в модели представления свойство, естественно Естественно, с INotifyPropertyChanged. Тьфу. Оно там не нужно. У меня же только в одну сторону - из вью в модель - изменения происходят. Надо же только файл выбрать и отдать его путь в модель, а не наоборот. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2015, 17:46 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Alexey2112, это ты тут сейчас с кем разговаривал? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2015, 17:49 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Шайтанэто ты тут сейчас с кем разговаривал? Оставьте его, он еще не закончил ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2015, 18:03 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Что-то не так? Сильно плохой подход? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2015, 19:50 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Alexey2112АлексейК, ты же, вроде, за "понерфить MVVM".Я за то, что каждый подход имеет свои преимущества и недостатки. Одна из главных задач при разработке архитектуры - выбрать наиболее подходящий подход в данном конкретном случае. Alexey2112Как относишься к предложенному подходу?Ну я активно использую code-behind + DependencyProperty + Binding, проблем за несколько лет не замечено. Я только не понял, зачем назначать Binding через Style+Setter. Alexey2112Или тоже за сервисы?Я за выделение классов по необходимости. Например, для повторного использования кода в разных контролах. Появилась необходимость - выносим часть кода в отдельный класс, даём новому классу гордое имя "сервис". :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 05:58 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Алексей КAlexey2112Как относишься к предложенному подходу?Ну я активно использую code-behind + DependencyProperty + Binding, проблем за несколько лет не замечено. Я только не понял, зачем назначать Binding через Style+Setter. Идея такая, что надо пробросить путь к выбранному файлу во вью модель. Выбор файла - через стандартный FileOpenDialog. Если этот диалог открывать во вью - то только в коде бихайнд (ну не в замле же?). Т. е. в коде бихайнд надо завести свойство, которое будет хранить выбранный путь к файлу. А теперь как связать это свойство со вью моделью? Если через замл, то свойство должно быть свойством зависимости. А как установить свойство зависимости в замле? - Ну, через стиль, например? У тебя есть вариант лучше? Хотя, можно и во вью модели сделать вызов OpenFileDialog - тогда не надо никакого гемора с байндингами и свойствами зависимостей - просто во вьюхе вяжешь команду из вью модели к кнопке и всё, ну а в команде открываешь диалог. Ведь, по идее, у нас вью зависит от фреймворка GUI, а вью модель должна "подстраивать" модель под это вью. Т. е. вью модель тоже каждый раз разная - в зависимости от платформы. Ну и диалог открытия файла - тоже разный в зависимости от платформы. Поэтому выбирать файл можно и в коде бихайнд вью, и в коде вью модели - они же всё равно оба зависят от фреймворка GUI. Вот моя логика. Наверное, перенесу открытие файла во вью модель, чтобы не гемориться с депенденси пропертями и байндингами. Вообще, я вижу это так по MVVM. Разделение модели и вью модели - чтобы писать логику предметной области на выбранном языке, не зависимом от языка приложения, которое будет показывать UI пользователю. Т. е. это как бы заточка и на то, чтобы вывести модель на сервер, и, если надо, разместить её в самом пользовательском приложении - да вообще, где угодно. Т. е. более кроссплатформенно сделать, когда UI уже не зависит от того, на чём написана модель. Разделение вью модели и вью - для стилизации. Т. е. и вью модель, и вью должны быть связаны каким-то общим фреймворком (для модели и вью модели это не обязательно). Т. е. имея одну вью модель, можем сделать много разных вью для неё - для разных устройв (типа, под мобильный тач, под десктоп и прочее), но всё - на одном GUI-фреймворке. Т. е. разделение вью и вью модели "менее сильное", чем модели и вью модели. Т. е. в некоторых случаях их можно довольно сильно связать - чтобы избавиться от привнесённых "правил" (искусственно созданных трудностей), когда многостилевость для UI не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 07:31 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Alexey2112Если через замл, то свойство должно быть свойством зависимости. А как установить свойство зависимости в замле? - Ну, через стиль, например? Я вот только не пойму, зачем иметь два свойства для свойства зависимости - т. е. само свойство зависимости и его так называемый backing field. Разве нельзя сразу привязаться к одному только dependency property? Если я уберу из своего кода выше обычное свойство FilePath, то привязка в замле не сработает - скажет, что не нашёл такого свойства. Почему так? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 07:33 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Алексей КЯ за выделение классов по необходимости. Например, для повторного использования кода в разных контролах. Появилась необходимость - выносим часть кода в отдельный класс, даём новому классу гордое имя "сервис". :-) Т. е., по идее, если надо не в одном месте подобный выбор файлов и байндинг на вью модель применять, то тогда лучше сервис? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 07:34 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Alexey2112Алексей Кпропущено... Ну я активно использую code-behind + DependencyProperty + Binding, проблем за несколько лет не замечено. Я только не понял, зачем назначать Binding через Style+Setter. Идея такая, что надо пробросить путь к выбранному файлу во вью модель. Выбор файла - через стандартный FileOpenDialog. Если этот диалог открывать во вью - то только в коде бихайнд (ну не в замле же?).code-behind имеет свойства скорее ViewModel, чем View. При таком отношении к code-behind всё встаёт на свои места. Считаю это ключевым моментом, на который стоит обратить особое внимание. Alexey2112 Т. е. в коде бихайнд надо завести свойство, которое будет хранить выбранный путь к файлу. А теперь как связать это свойство со вью моделью? Если через замл, то свойство должно быть свойством зависимости. А как установить свойство зависимости в замле? - Ну, через стиль, например? У тебя есть вариант лучше?Для биндинга на code-behind мы применяем такое расширение разметки. Тут писал об этом: "Особенности применения UserControl" . Alexey2112Хотя, можно и во вью модели сделать вызов OpenFileDialog - тогда не надо никакого гемора с байндингами и свойствами зависимостей - просто во вьюхе вяжешь команду из вью модели к кнопке и всё, ну а в команде открываешь диалог.Нет никакого гемора, если дополнить WPF своим расширением разметки, как показано выше. Alexey2112Ведь, по идее, у нас вью зависит от фреймворка GUI, а вью модель должна "подстраивать" модель под это вью. Т. е. вью модель тоже каждый раз разная - в зависимости от платформы. Ну и диалог открытия файла - тоже разный в зависимости от платформы. Поэтому выбирать файл можно и в коде бихайнд вью, и в коде вью модели - они же всё равно оба зависят от фреймворка GUI. Вот моя логика.Я не ставлю задачу переносимости ViewModel между разными UI-Фреймворками. Считаю это глупой затеей. Alexey2112Наверное, перенесу открытие файла во вью модель, чтобы не гемориться с депенденси пропертями и байндингами.Если ставится задача переносимости, то да, работу с FileDialog нужно выносить в UI-зависимый отдельный сервис. Alexey2112Вообще, я вижу это так по MVVM. Разделение модели и вью модели - чтобы писать логику предметной области на выбранном языке, не зависимом от языка приложения, которое будет показывать UI пользователю. Т. е. это как бы заточка и на то, чтобы вывести модель на сервер, и, если надо, разместить её в самом пользовательском приложении - да вообще, где угодно. Т. е. более кроссплатформенно сделать, когда UI уже не зависит от того, на чём написана модель. Разделение вью модели и вью - для стилизации. Т. е. и вью модель, и вью должны быть связаны каким-то общим фреймворком (для модели и вью модели это не обязательно). Т. е. имея одну вью модель, можем сделать много разных вью для неё - для разных устройв (типа, под мобильный тач, под десктоп и прочее), но всё - на одном GUI-фреймворке. Т. е. разделение вью и вью модели "менее сильное", чем модели и вью модели. Т. е. в некоторых случаях их можно довольно сильно связать - чтобы избавиться от привнесённых "правил" (искусственно созданных трудностей), когда многостилевость для UI не требуется.Скорее так: Model содержит прикладную логику, ViewModel содержит логику представления. Alexey2112Алексей КЯ за выделение классов по необходимости. Например, для повторного использования кода в разных контролах. Появилась необходимость - выносим часть кода в отдельный класс, даём новому классу гордое имя "сервис". :-) Т. е., по идее, если надо не в одном месте подобный выбор файлов и байндинг на вью модель применять, то тогда лучше сервис? Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
vs Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 08:01 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Автор, основной смысл должен быть просто и понятен. Есть View, в котором открывается диалоговое окно, которая является частью View и свойство в ViewModel которое должно связано с каким то DP во View, всё остальное особого значения не имеет. делать можно как угодно, можно создать контрол типа Popup, который является частью визуального дерева, но не визуализирован по сути, который будет принимать маршрутизируемую команду, можно через AttachedProperty реализовать кодбехайнд или как автор на форме. Как по мне, всё это одно и тоже, но в классе окна я обычно код не размещаю вообще. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 13:26 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Алексей КЯ только не понял, зачем назначать Binding через Style+Setter. А в чём, собственно, проблема? Просто непривычно для тебя, или какой-то плохой эффект от такого назначения ты усматриваешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 14:39 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Roman Mejtesно в классе окна я обычно код не размещаю вообще По-моему, дурацкое какое-то ограничение. Везде пишут "не размещать!", но при этом возможность такую дают. Множат сущности без причины, а в результате путают новичков. Да даже старички тоже до пены у рта спорят - применять или не применять. По мне, так этот коде-бихайнд вообще был придуман для совместимости с программированием а-ля Win Forms с кодом прямо в обработчиках - чтобы люди с форм безболезненно могли перейти на WPF. В самом WPF, с отвязкой от форм и привязкой к MVVM, коде-бихайнд надо было бы вообще исключить как возможность. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 14:42 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
авторВ самом WPF, с отвязкой от форм и привязкой к MVVM, коде-бихайнд надо было бы вообще исключить как возможность. Не в "самом", а в "чистом". ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 14:43 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Alexey2112, ну имхо, если код выполняемый в классе окна не выходит за рамки View, то в этом плохого нет. Но лично я события на кнопках или подобных вещах не использую, это очень сильно запутывает, мало того, что мне надо копаться в коде XAML, дак еще и в коде формы какое то поведение есть. И далеко не всегда очевидно, что оно вообще есть. По этому разумнее использовать Behavior<> или AttachedProperty для таких целей, тогда будет сразу из XAML где и что. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 17:48 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Алексей КЯ за выделение классов по необходимости.У тебя это прям идея фикс какая-то :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2015, 20:19 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Alexey2112Алексей КЯ только не понял, зачем назначать Binding через Style+Setter. А в чём, собственно, проблема? Просто непривычно для тебя, или какой-то плохой эффект от такого назначения ты усматриваешь?Ну мне показалось, что это не самый простой способ. Или я не понял, зачем так сделано. skyANAАлексей КЯ за выделение классов по необходимости.У тебя это прям идея фикс какая-то :)Есть такое. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2015, 05:28 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Алексей КAlexey2112пропущено... А в чём, собственно, проблема? Просто непривычно для тебя, или какой-то плохой эффект от такого назначения ты усматриваешь?Ну мне показалось, что это не самый простой способ. Или я не понял, зачем так сделано. Да это просто первое, что я нагуглил на сайте StackOverflow. А какие ещё способы есть? Какие проще? Ну, ещё можно в code-behind сделать: Код: c# 1. 2. 3. 4.
Только у меня это не срабатывает, если я в конструкторе юзер контрола это пишу - свойство DataContext ещё не установлено даже после вызова InitializeComponent(). Пришлось запихать этот ход в обработчик события кнопки. Т. е. сейчас у меня так, как в первом посте, только байндинг из стиля убрал. В моём юзер контроле есть кнопка, у неё есть обработчик события - в code-behind. В обработчике я устанавливаю байндинг кодом выше, потом вызываю Microsoft.Win32.OpenFileDialog dlg и потом устанавливаю значение свойства зависимости SetValue(FilePathProperty, dlg.FileName); ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2015, 08:20 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Это если заморачиваться всяким разделением кода. А можно ведь просто взять, а включить в code-behind юзер контрола пространство имён моей вью модели и просто в обработчике кнопки присвоить выбранный путь к файлу сразу ко свойству вью модели - безо всяких байндингов. Но самый лучший способ для меня среди всех этих извращений - вызывать Microsoft.Win32.OpenFileDialog во вью модели в коде команды, а команду вязать на кнопку моего юзер контрола. Тогда code-behind вьюхи чистый и вся логика по выбору файла - во вью модели. Считаю, что это лучше, чем городить сервисы какие-то. Как я сказал, ведь всё равно вью модель завязана на текущий UI-фреймворк, т. е. и на способ выбора файла через диалоговое окно она завязана. Поэтому не вижу ничего плохого в том, что вью модель будет иметь ссылку на пространство имён Microsoft.Win32 и открывать диалог оттуда. Ну а извращения с байндингами в code-behind или в стилях - это именно извращения. Ну, зато поупражнялся во всяких нестандартных вещах. ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2015, 08:24 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Alexey2112Но самый лучший способ для меня среди всех этих извращений - вызывать Microsoft.Win32.OpenFileDialog во вью модели в коде команды, а команду вязать на кнопку моего юзер контрола. Точнее, самый простой. А ещё подскажите по этому авторНу, ещё можно в code-behind сделать: Binding b = new Binding("SourceFilePath"); b.Mode = BindingMode.TwoWay; b.Source = DataContext; SetBinding(FilePathProperty, b); Только у меня это не срабатывает, если я в конструкторе юзер контрола это пишу - свойство DataContext ещё не установлено даже после вызова InitializeComponent(). Пришлось запихать этот ход в обработчик события кнопки. как сделать, чтобы байндинг срабатывал не в обработчике кнопки, а где-нибудь при создани юзер контрола? Вот парсер XAML, судя по всему, делает это же как-то. Если он делает это не в конструкторе юзер контрола, то где? Может, в событие, типа Loaded запихать? Upd.: запихал - работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2015, 08:31 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Alexey2112, Если нужно создать связывание внутри шаблона, то можно использовать переопределяемый метод ApplyTemplate, он вызывает когда применяется шаблон элемента, в этот момент можно создать связывание внутри шаблона. В нём же можно запросить все именованные объекты шаблона через GetTemplatePart или как то так, глянь pretected методы. Если нужно создать binding на сам контрол, то лучше просто использовать Binding в стиле. А чтоб не указывать в Binding'е TwoWay, можно задать этот режим по умолчанию в самом DP. + .Source = DataContext, бессмысленная строка. Без явного указания источника связывание и так идет с контекстом данных. В кнопка же лучше использовать RoutedCommand или можно создать отдельный класс унаследованный от ICommand который будет вызывать диалоговое окно, а в качестве параметра можно передать ссылку на объект в котором нужно сохранить путь к папке. Или элемент интерфейса к которому будет присваиваться путь к папке которую ты открыл через AttachedProperty. Потом это этот AttachedProperty свяжешь с полем в ViewModel и получишь команду которой можно всегда пользоваться :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2015, 11:28 |
|
Подход к открытию файла с MVVM
|
|||
---|---|---|---|
#18+
Roman MejtesAlexey2112, Если нужно создать связывание внутри шаблона, то можно использовать переопределяемый метод ApplyTemplate, он вызывает когда применяется шаблон элемента, в этот момент можно создать связывание внутри шаблона. В нём же можно запросить все именованные объекты шаблона через GetTemplatePart или как то так, глянь pretected методы. Если нужно создать binding на сам контрол, то лучше просто использовать Binding в стиле. А чтоб не указывать в Binding'е TwoWay, можно задать этот режим по умолчанию в самом DP. + .Source = DataContext, бессмысленная строка. Без явного указания источника связывание и так идет с контекстом данных. Я про байндинг в коде, а не в замле. Ну, когда создаёшь объект Binding вручную и вызываешь метод SetBinding, например. Да ладно, я уже для себя разобрал возможные варианты и сделал так, как выше сказал - вью модель вызывает открытие диалога - и не парюсь всякими заморочками. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2015, 11:56 |
|
|
start [/forum/topic.php?fid=21&msg=38959364&tid=1440867]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
123ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 259ms |
total: | 478ms |
0 / 0 |