|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
Че-то пока не получилось найти оперативно решение - буду продолжать искать. Но возможно кто-то уже сталкивался с этим и поможет быстрее решить проблему. Есть что-то вроде этого Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Но у меня команда не срабатывает. Если я прицеплю команду к самому листбоксу (соответсвенно команда для листбокска - типа mouseneter) то команда срабатывает. Но мне то нужно обработать команду чекбокса. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 14:45 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
unknownfromrus, output window что показывает? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 14:50 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
AlexeiK, Вот что показывает Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 14:58 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
unknownfromrus, вот видишь :) теперь и сам исправишь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 14:59 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
AlexeiK, Я пока никак не могу сообразить что не так)) Если я выношу все за DataTemplate - то работает для тех контролов, которые находятся во ВНЕ. Но все, что сидит в DataTemplate не прокатывает ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 15:03 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
AlexeiK, В общем вопрос решил. Но все-таки зря ты так к нему легко отнесся. Пока рылся в инете понял, что это популярная проблема)) Смысл проблемы в том, что контрол, встроенный в DataTemplate не виден базовому контролу (User или Window). Поэтому есть два решения проблемы: 1. Самый простой - указываем статик ресурс непосредственно на класс команд - это решение в лоб, и тем, кто придерживается паттерна MVVM оно может не понравиться)) 2. Не буду расписывать что и почему - вот ссылка, думаю кто захочет - разберется http://stackoverflow.com/questions/5576487/eventtrigger-not-working-inside-itemscontrol-in-mvvm ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 18:35 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
Это не проблема. Связывание нужно задавать через RelativeSource ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 22:42 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
SeVa, В том -то дело что не прокатывает. Вот скажи мне разницу между двумя этими кодами с точки зрения исполнения: <TextBox Text="10" x:Name="name_text" FontSize={Binding ElementName=name_text, Path=Text}/> и <TextBox Text="10" x:Name="name_text" FontSize={Binding RelativeSource={RelativeSource self}, Path=Text}/> С точки зрения выполнения кода никакой разница - стиль написания разный. Так вот - попробуй сам у себя к UserControl прицепи через DataContext ViewModel, в которой у тебя будут команды (н наверо еще что-то будет). Далее в UserControl у тебя будет ListBox, который будет определять DataTemplate, в котором будет, например CheckBox/ А вот теперь попробуй через RelativeSource подцепить команду от UserControl к CheckBox, а потос через ICommand обработай ее (если подцепиш конечно). Я тебе даже больше скажу - если ты через команду во вне передашь свой юзер контрол и посомтришь что в нем сидит - то ты никаких CheckBox не увидишь. Чтобы добраться до CheckBox который сидит в DateTamplate - то надо другой способ вытаскивания эелементов испльзовать, а не стандартный FindName. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 00:32 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
Да, проблема известная. Причина в том, что элементы DataTemplate не являются частью logical tree основного контекста. У меня эта проблема как-то раз всплыла при привязке ICommand к пунктам контекстного меню, которое было частью DataTemplate - выкрутился примерно так: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Если не изменяет память, помогло вот это обсуждение: http://stackoverflow.com/questions/9994241/mvvm-binding-command-to-contextmenu-item ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 03:23 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
Пробовал и не раз. тынц ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 09:17 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
SeVa, Не понимаю, почему у тебя идет,а у меня - нет. Может быть дашь примерчик небольшой? Ту ссылку - которую т ыдал - она не прокатывает - только что попробовал. Вот такой код: Код: 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. 47.
SeVa, добавь к CheckBox RelativeSource так, чтобы команда через ICommand, которая определена в другом файле и подключается к UserControl через DataContext: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Если заработает - я тебе поапладирую двумя руками)) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 10:06 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
unknownfromrus, Код: xml 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 15:13 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
так же не ясно куда относится это Код: xml 1.
в общем правило работы с DataTemplate таково: чтобы пробить Binding на все что лежит вне блока DataTemplate нужно использовать StaticResource ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 15:18 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
уТКав общем правило работы с DataTemplate таково: чтобы пробить Binding на все что лежит вне блока DataTemplate нужно использовать StaticResource Не обязательно - см. выше мой кусок кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 16:38 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
уТКа, Так я об этом и писал выше. StaticResource - ты напрямую ссылаешься на класс команд. У меня сейчас именно так реализовано. Но это нарушает паттерн MVVM, так как команды я должно коннектить кидать во ViewModel, а DataContext UserControl цеплять к этой ViewModel. Соответсвенно нельзя испльзовать вариант StaticResource to Command Я об этом уже выше писал. Seva же говрит, что он как-то смог подцепить команду к контролу (мой пример) и при этом все цепляется к DataContext UserControl ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 18:26 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
уТКатак же не ясно куда относится это Код: xml 1.
в общем правило работы с DataTemplate таково: чтобы пробить Binding на все что лежит вне блока DataTemplate нужно использовать StaticResource Почему же это неясно? Очень даже ясно. MyUSerControl.DataContext = MyViewModel; При этом во ViewModel сидит мой класс команд. Поэтому очень даже все ясно с этим. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 18:28 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
Через StaticResource - можно, но некошерно <Button Command="{Binding RelativeSource={RelativeSource AncestorType=MyControl}, Path=DataContext.MyCommand}" /> ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 19:43 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
unknownfromrusПочему же это неясно? Очень даже ясно. MyUSerControl.DataContext = MyViewModel; При этом во ViewModel сидит мой класс команд. Поэтому очень даже все ясно с этим. по феншую ViewModel не должна объявляться во View (в коде). я лично объявлял статический ресурс и все везде работало как мне хотелось. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 22:02 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
уТКа, Не совсем с тобой согласен. ViewModel ничего не дожен знать о View. В этом правило есть смысл - так как я всегда могу подцепить другую View-ху Поэтому я не зря отписал про MVVM и о том, почему я не стал использовать StaticResource прямо в лоб файла команд. В общем есть два решения, которые я уже описывал.: 1. Кладем на правила MVVM и испльзуем StaticResource 2. Идем по ссылке - котору я давал в начале темы и делаем так как там описано (то же самое предлагается в ссылке, которую дал УткА ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 23:20 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
unknownfromrus, давайте крякать до конца :) что мешает объявить ViewModel в статических ресурсах Xaml файла? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2012, 00:00 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
уТКа, Ладно, дальше тема ушла в не то направление))) Главное - чот если кто столкнется с подобным - сможет съэкономить время - заглянув на эту ветку)) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2012, 00:10 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
unknownfromrus, ну вот, говоришь человеку: "съешь этих сладких булочек" а он: "я буду есть грязную вонючую собаку" ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2012, 00:31 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
уТКа, Да нет, как раз я использую StaticResource. Я просто обсуждал с тобой дальше - потому что применение StaticResource в моем случае нарушает концепцию паттерна MVVM ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2012, 01:24 |
|
DataTemplate ICommand
|
|||
---|---|---|---|
#18+
unknownfromrus, А по поводу грязная булочка и т.п. Тоже с тобой не соглашусь. В идеале - не очень хорошо, когда у тебя эелементы цепляются к ресурсам таким образом и т.п. DataContext не просто так придумывали. И не зря при правильном написании приложения WPF MVVM к DataContxt корневого элемента целпяют ViewModel и в нее сажают бизнес логику - в том числе и команды. Ведь представь, ты решил сделать изменения. Ведь как легко их делать и оперативно, когда у тебя эелемень цепляется к DataContext корневого эелемента, и когда на нем не висит куча разных Resource - лично сам сталкивался не раз - когда возвращался чтобы изменить визуализированный эелемент и при этом полностью оставить бизнес логику ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2012, 01:28 |
|
|
start [/forum/topic.php?fid=21&msg=37878800&tid=1441746]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 325ms |
total: | 496ms |
0 / 0 |