|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
Добрый день! Пишу программу с использованием WPF, паттерн MVVM. Наткнулся на такую проблему: Дано: 1. Вью модель TempPriceDetailViewModel. 2. Вьюшка для модели из пункта 1. TempPriceDetailView. Внутри вьюшки написаны 2 команды реализующие функционал Next/Prev запись. Все работает отлично! Проблема: Добавляю на TabControl в мейн окне 2 подряд вью модели из пунка 1. В итоге команды работают, но работают ТОЛЬКО для какой то одной из вью моделей в какой бы из них не делался клик. Т.е.: Добавляю 2 вью модели и где бы я не кликал по кнопкам Next/Prev они будут отрабатывать только для первой добавленной. Еще странность в следующем, если добавить не 2 подряд, а между ними вызвать какую нибудь другую вью модель, то кнопки перестают работать на первой вью модели и отрабатывают для второй(даже при клике в первой). Постарался излагать по максимуму подробно, подскажите в чем ошибка, легко можно и в клике кнопки обрабатывать переключение, но командами удобнее и мало ли где в более сложной ситуации проявится подобное поведение, приятного будет мало... XAML разметка с привязкой команд, ненужные детали опущенны: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Код команд, может будет полезным(хотя врятли): /// <summary> /// Перейти к следующему элементу /// </summary> public RelayCommand GoNext { get { if (_GoNext == null) _GoNext = new RelayCommand(GoNext_Executed, GoNext_CanExecute); return _GoNext; } }RelayCommand _GoNext; /// <summary> /// Выполнение команды перехода к следующему элементу /// </summary> /// <param name="parameter"></param> void GoNext_Executed(Object parameter) { TempPriceDetailDefaultView.MoveCurrentToNext(); } /// <summary> /// проверка возможности выполнения перехода к следующему элементу /// </summary> /// <param name="parameter"></param> /// <returns></returns> bool GoNext_CanExecute(Object parameter) { if (TempPriceDetailDefaultView != null) return TempPriceDetailDefaultView.CurrentPosition < TempPriceDetailDefaultView.Count - 1; return false; } /// <summary> /// Перейти к следующему элементу /// </summary> public RelayCommand GoPrevious { get { if (_GoPrevious == null) _GoPrevious = new RelayCommand(GoPrevious_Executed, GoPrevious_CanExecute); return _GoPrevious; } }RelayCommand _GoPrevious; /// <summary> /// Выполнение команды перехода к следующему элементу /// </summary> /// <param name="parameter"></param> void GoPrevious_Executed(Object parameter) { TempPriceDetailDefaultView.MoveCurrentToPrevious(); } /// <summary> /// проверка возможности выполнения перехода к следующему элементу /// </summary> /// <param name="parameter"></param> /// <returns></returns> bool GoPrevious_CanExecute(Object parameter) { if (TempPriceDetailDefaultView != null) return TempPriceDetailDefaultView.CurrentPosition > 0; return false; } ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2012, 18:06 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
авторДобавляю на TabControl в мейн окне 2 подряд вью модели из пунка 1. Код в студию. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2012, 21:43 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
Связывание должно быть не через ElementName(разные View c одинаковыми именами) и это не MVVM(команды должны быть в ViewModel). Делай или relative binding или нормальный MVVM. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2012, 22:11 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
SeVaСвязывание должно быть не через ElementName(разные View c одинаковыми именами) и это не MVVM(команды должны быть в ViewModel). Эти команды это вопрос отображения данных, тем более ходим с одной записи на другую через ListCollectionView(его передавать во ViewModel? Как?) полученный от CollectionViewSource. Поэтому команды были засунуты в морду. Лепить непонятно зачем во ViewModel'и переходы не вижу смысла... куча подпорок просто. SeVaДелай или relative binding или нормальный MVVM. в чем разница в моем случае, через RealtiveSource вязаться или через ElementName? Тем более что аналогичное поведение и через relative. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2012, 08:18 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
1.Если непонятно зачем ViewModel, то зачем его упоминать? Судя, по Loaded="usPriceCompare_Loaded" им здесь не пахнет. 2. Именование - дурной тон это раз, а вовторых - с ним не работает ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2012, 13:25 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
Если я правильно понял, то можно команды разместить в вьюмодели и добавить в нее же(вьюмодель) SelectedItem, который надо забиндить на SelectedItem вьюшки. И в командах изменять вьюмодельный SelectedItem. По крайней мере я так делаю ) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2012, 07:58 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
SeVa1.Если непонятно зачем ViewModel, то зачем его упоминать? Судя, по Loaded="usPriceCompare_Loaded" им здесь не пахнет. 2. Именование - дурной тон это раз, а вовторых - с ним не работает SeVa, пожалуйста, сбавьте спесь, я описал ситуацию, задал конкретный вопрос, и хотел бы на него получить ответ. Подход к реализации это моё дело, я считаю, что чрезмерная педантичность в использовании паттернов только вредна, тем более я указал почему я решил делать именно в морде переход по записям. Судя, по Loaded="usPriceCompare_Loaded" им здесь не пахнет здесь получаю DefaultView для моей коллекции данных. Еще раз повторяю подход к реализации это мое дело. 2. ... а вовторых - с ним не работает сказал "А", говори "Б" - по какой причине с ним не работает? Это и будет ответ на мой вопрос и тему можно будет смело закрывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2012, 09:29 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
Sky DragonЕсли я правильно понял, то можно команды разместить в вьюмодели и добавить в нее же(вьюмодель) SelectedItem, который надо забиндить на SelectedItem вьюшки. И в командах изменять вьюмодельный SelectedItem. По крайней мере я так делаю ) Дело в том, что тут потребуется дополнительная подпорка в виде какого нибудь ItemsControl'а на SelectedItem которого я смогу забиндить SelectedItem определенный во вью модели. Можно конечно так подойти к делу(во всех остальных вьюшках используется именно такой подход), но вопрос в другом, почему не работает мой подход, меня просто пугает, что можно наткнуться на такую же ситуацию в менее явном виде и тогда придется долго долго выяснять в чем дело. ... И в командах изменять вьюмодельный SelectedItem. ... а тут ситуация в следующем, непонятно как ходить по записям, в ListCollectionView предоставляемым CollectionViewSource'ом предоставляются удобные методы MoveCurrentNext(), MoveCurrentPrevious() у коллекции данных ObservableCollection<T> таких методов нет и нет текущего элемента. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2012, 09:35 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
Пришла в голову мысль немного доработать ObservableCollection и добавить ей функционал перехода по записям, как раз таки тогда можно смело переносить команды во ВьюМодель и конретная ситуация будет решена. Но вопрос все таки остается отрытым, в чем ошибка? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2012, 09:37 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
xpoft2010но вопрос в другом, почему не работает мой подход, меня просто пугает, что можно наткнуться на такую же ситуацию в менее явном виде и тогда придется долго долго выяснять в чем дело. Посмотрел более внимательно на твой бред в первом топике - в огороде бузина, а в Киеве дядька. Ты был прав, код твоих команд совершенно бесполезен. Сбавь спесь, садись за буквари ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2012, 10:19 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
SeVaxpoft2010но вопрос в другом, почему не работает мой подход, меня просто пугает, что можно наткнуться на такую же ситуацию в менее явном виде и тогда придется долго долго выяснять в чем дело. Посмотрел более внимательно на твой бред в первом топике - в огороде бузина, а в Киеве дядька. Ты был прав, код твоих команд совершенно бесполезен. Сбавь спесь, садись за буквари Конструктивно, красавец! 2. ... а вовторых - с ним не работает сказал "А", говори "Б" - по какой причине с ним не работает? ... стало быть услышал звон, не знаю где он. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2012, 10:59 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
Еще похами, тогда я точно, все брошу и начну чинить твой бред ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2012, 11:27 |
|
MVVM привязка команд, не могу разобраться
|
|||
---|---|---|---|
#18+
SeVaЕще похами, тогда я точно, все брошу и начну чинить твой бред Слушай, торжественно освобождаю тебя от необходимости "чинить" как ты выражаешься мой бред. Пока я от тебя ни слова дельного не услышал. 1.Если непонятно зачем ViewModel, то зачем его упоминать? Судя, по Loaded="usPriceCompare_Loaded" им здесь не пахнет. с чего такой вывод непонятно, я тебе дал ответ почему так делаю. 2. Именование - дурной тон это раз, а вовторых - с ним не работает Почему с ним не работает ты уже 2 раза не ответил, из чего я сделал вывод что ты сам не знаешь. Где хамство с моей стороны? Еще похами, тогда я точно, все брошу и начну чинить твой бред а вот это уже хамство. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2012, 11:39 |
|
|
start [/forum/topic.php?fid=21&fpage=42&tid=1441905]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 142ms |
0 / 0 |