|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Есть в Призме такая штука, как возможность подключения команд через триггеры. Там добавляем две ссылочки Код: xml 1. 2.
и делаем так Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
А в коде пишем (с использованием DelegateCommand<T> из той же Призмы) так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Так вот, вопрос - где это написано, что параметр метода MyMethod - это тот самый CommandParameter, который мы в XAML передавали? Я нигде не встречал, что они связаны. Пришлось долго биться, чтобы до этого допереть. Потому что в примерах, что я встречал, был простой случай без параметра - приделали команду и всё. Дайте, пожалуйста, ссылку на как можно более официальный текст, где сказано, что эти вещи именно связаны. Хочется поподробнее почитать. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2014, 16:59 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Зачем тебе ссылка, у тебя уже есть DelegateCommand<MyType>, а в доках к prism подобные вопросы не освещаются, это фича mvvm, разница лишь в том, что в призм изначально заложен strong & weak reference ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 00:29 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
user7320где это написаноВ исходниках. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 06:12 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
TorreЗачем тебе ссылка, у тебя уже есть DelegateCommand<MyType>, а в доках к prism подобные вопросы не освещаются, это фича mvvm, разница лишь в том, что в призм изначально заложен strong & weak reference То, что это DelegateCommand<MyType> - это моя приписка. Вообще, в примерах максимум делается примерно так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Чувствуете разницу? Нигде нет отсылки, что та штука, которую мы в XAML в байндинге указываем в качестве CommandParameter и которая имеет тип MyType - это именно something, которую мы зачем-то специально потом приводим к типу MyType. Только по совпадению типов в байндинге и в приведении типа в MyMethod я до этого допёр. А вообще говоря, это неочевидно. Максимум, что я видел, это something назовут parameter. И всё равно это неочевидно, что это параметр команды. Вот вы с первого раза догадались, что это такое и как это использовать, или вас это даже не интересовало и вы просто переписали пример? Алексей Кuser7320где это написаноВ исходниках. В исходниках DelegateCommand<T> или в исходниках System.Windows.Interactivity.InvokeCommandAction? Т. е. надо декомпилировать System.Windows.Interactivity.InvokeCommandAction, а иначе не узнать? Я вот смотрел http://msdn.microsoft.com/en-us/library/system.windows.interactivity.invokecommandaction.commandparameter(v=expression.40).aspx - нету ничего про это соответствие параметру в InvokeCommandAction. Смотрел описание DelegateCommand<T> Код: 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. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77.
- тоже ничего нет про соответсвтие параметру в InvokeCommandAction. Или вы имеете ввиду исходники, полученные в результате декомпиляции ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 07:58 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Не знаю, я как-то этим вопросом не занимался, сказано ведь: Код: c# 1. 2.
Все вроде понятно ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 09:34 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
user7320В исходниках DelegateCommand<T> или в исходниках System.Windows.Interactivity.InvokeCommandAction? Т. е. надо декомпилировать System.Windows.Interactivity.InvokeCommandAction, а иначе не узнать?InvokeCommandAction. Тут проще взять рефлектор чем искать документацию. DelegateCommand тоже посмотри, хуже не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 09:35 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Я бывает и вот так передаю: Код: c# 1.
т.е. сразу целиком окно, затем выбираю окно или нужный контрол: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 09:40 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Алексей Кuser7320В исходниках DelegateCommand<T> или в исходниках System.Windows.Interactivity.InvokeCommandAction? Т. е. надо декомпилировать System.Windows.Interactivity.InvokeCommandAction, а иначе не узнать?InvokeCommandAction. Тут проще взять рефлектор чем искать документацию. DelegateCommand тоже посмотри, хуже не будет. Когда проще взять Рефлектор - это говно. DelegateCommand смотрел (привёл его описание выше в своём посте же) - ничего про InvokeCommandAction там нет. Я так понял, это две изначально несвязанные в общем случае... эмм... технологии, которые можно связать в частном случае, чтобы добиться желаемого. TorreНе знаю, я как-то этим вопросом не занимался, сказано ведь: Код: c# 1. 2.
Все вроде понятно Как из этого понять, что InvokeCommandAction.CommandParameter это параметр метода делегата DelegateCommand<T>? TorreЯ бывает и вот так передаю: Код: c# 1.
т.е. сразу целиком окно, затем выбираю окно или нужный контрол: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Вы такой код сразу начали писать, как только увидели InvokeCommandAction, или кто-то вам подсказал, как надо делать и что там к чему? И это, я не имел ввиду вообще команды, а именно InvokeCommandAction, которая даёт возможность прицеплять команды к событиям для элементов, для которых изначально в ванильном WPF привязка команд не предусмотрена. Ну т. е. никто ни в каком МСДНе или ещё какой документации ничего подобного не находил, что InvokeCommandAction.CommandParameter и параметр метода делегата DelegateCommand<T> - это одно и то же? Всё через Рефлектор или через собственные нервы? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 10:04 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
user7320Когда проще взять Рефлектор - это говно.Почему? Мне кажется, что хорошо написанная программа лучше любой документации, когда речь идёт о деталях реализации. user7320Я так понял, это две изначально несвязанные в общем случае... эмм... технологии, которые можно связать в частном случае, чтобы добиться желаемого.Да ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 10:08 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Не использую InvokeCommandAction, для DataTrigger достаточно свойства: Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 10:51 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
TorreНе использую InvokeCommandAction, для DataTrigger достаточно свойства: Код: c# 1.
Вы так говорите, будто DataTrigger решает те же задачи, что и InvokeCommandAction и они взаимозаменяемы. А если мне нужно выполнить код по клику (MouseDown) на какой-нибудь StackPanel, но в контексте MVVM? Ладно, я разобрался и рад. А другие, особенно новички, пусть сами мучаются, хе-хе-хе. ))) Буду брать деньги за консультации. ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 10:58 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Да это только начало, дальше длинная и извилистая прямая: Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 11:31 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
TorreДа это только начало, дальше длинная и извилистая прямая: Код: c# 1.
Даже так?.. А как выглядит полный пример? Зачем тогда InvokeCommandAction придумали? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 11:34 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Ссылка Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 13:12 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Torre Ссылка Код: 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.
Не вижу, где это (EventTrigger, DataTrigger) пересекается с функциональностью InvokeCommandAction и вообще командами. У меня есть модель представления (MVVM и всё такое), там есть метод или команда - как его (её) вызвать по событию MouseDown для контрола StackPanel? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 15:55 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Что сделать хочешь? Какое событие? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 23:49 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
TorreЧто сделать хочешь? Какое событие? У меня есть модель представления (шаблон проектирования MVVM), там есть метод или команда - как его (её) вызвать по событию MouseDown для контрола StackPanel? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2014, 05:35 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
TorreЧто сделать хочешь? Какое событие? Я вот выше привёл пример с InvokeCommandAction Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
Как сделать это же, но с вашим подходом? Они тоже использовали триггеры. Но к триггерам у них есть удобная добавка в виде назначения команды или метода, который нужно вызвать при событии, указанном в триггере. Также у них есть возможность передачи параметра (лучше бы было несколько, но конкретно у них такого нет, а в других реализациях я это видел) - это важно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2014, 05:38 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
И понятно, что можно накодить самому. Но я так понимаю, у вас есть подход без "накодить самому" - чисто средствами ванильного WPF-XAML? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2014, 05:38 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
user7320А другие, особенно новички, пусть сами мучаются, хе-хе-хе. И чего тут мучаться? Забиваем в гугл https://www.google.ru/search?q=Prism delegatecommand , по первой ссылке приходим сюда: http://msdn.microsoft.com/en-us/library/gg431410(v=pandp.40).aspx , переходим к хелпу по конструктору с перегрузкой DelegateCommand<T>(Action<T>): http://msdn.microsoft.com/en-us/library/gg405544(v=pandp.40).aspx - а там ясным английским языком написано, что Код: c# 1. 2. 3.
executeMethod Type: System.Action<T> Delegate to execute when Execute is called on the command. This can be null to just hook up a CanExecute delegate. Далее забывчивые могут открыть хелп по ICommand.Execute (DelegateCommand реализует ICommand - К.О.), и прочитать: Код: c# 1. 2. 3.
Parameters parameter Type: System.Object Data used by the command. If the command does not require data to be passed, this object can be set to null. Призмовцы просто сделали типизированную обертку, реализующую ICommand - перед передачей параметра в CanExecute/Execute он приводится к генерик-типу. Ну, и наконец: InvokeCommandAction.CommandParameter : Remarks This is the value passed to ICommand.CanExecute and ICommand.Execute. Хотя мне лично это всё было понятно и без путешествий по хелпам. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2014, 06:30 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
user7320Ладно, я разобрался и рад. А другие, особенно новички, пусть сами мучаются, хе-хе-хе. ))) Буду брать деньги за консультации. )))Хоть в курсе про возможную утечку памяти при такой реализации DelegateCommand? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2014, 07:45 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныПризмовцы просто сделали типизированную обертку, реализующую ICommand - перед передачей параметра в CanExecute/Execute он приводится к генерик-типу.Недоделали. Есть случай, когда "это" не работает. WPF пожет биндингом отправить в CommandParameter служебный объект, вроде DependencyProperty.UnsetValue. Таких объектов там несколько, все сейчас не вспомню. Приведение служебного объекта к типу T вызовет в этом месте ошибку: Код: c# 1. 2. 3. 4.
Нормальная реализация типизации параметра должна выглядеть как-то так: RelayCommandOfT , RelayCommandBase . Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2014, 07:55 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Алексей КНедоделали. Есть случай, когда "это" не работает. WPF пожет биндингом отправить в CommandParameter служебный объект, вроде DependencyProperty.UnsetValue. Таких объектов там несколько, все сейчас не вспомню. Да, про эти недоделки и хелп пишет: The constructor deliberately prevent the use of value types. Because ICommand takes an object, having a value type for T would cause unexpected behavior when CanExecute(null) is called during XAML initialization for command bindings. Using default(T) was considered and rejected as a solution because the implementor would not be able to distinguish between a valid and defaulted values. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2014, 09:14 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныДа, про эти недоделки и хелп пишет: The constructor deliberately prevent the use of value types. Because ICommand takes an object, having a value type for T would cause unexpected behavior when CanExecute(null) is called during XAML initialization for command bindings. Using default(T) was considered and rejected as a solution because the implementor would not be able to distinguish between a valid and defaulted values. Проблему с ValueType можно решить, используя Nullable<T>. Проблему с DependencyProperty.UnsetValue в их реализации решить не получится. Об этом они почему-то не пишут. Сложившаяся ситуация мне чем-то напоминает проблемы, возникающие с DbNull.Value. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2014, 09:52 |
|
Про команды из Prism-Blend
|
|||
---|---|---|---|
#18+
Алексей КDependencyProperty.UnsetValue Сначала косячим, а потом делаем железный тазик, чтобы они не стучали по одному месту msdnUnsetValue is a sentinel value that is used for scenarios where the WPF property system is unable to determine a requested DependencyProperty value. UnsetValue is used rather than null, because null could be a valid property value, as well as a valid (and frequently used) DefaultValue. UnsetValue is never returned out of DependencyObject.GetValue. When you call DependencyObject.GetValue on a dependency property on a DependencyObject instance, one of the following applies: •A dependency property has a default value established in metadata and that value is returned. This value might come from DefaultMetadata. •Some other value was established by the property system, and the default value is no longer relevant. For details, see Dependency Property Value ЗЫ 2TS, бессовестный МС заставил посмотреть исходники, я бы жаловался в Лигу наций msdn<Button Command="{Binding Path=SubmitCommand}" CommandParameter="SubmitOrder"/> ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2014, 10:44 |
|
|
start [/forum/topic.php?fid=21&fpage=25&tid=1441201]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 288ms |
total: | 443ms |
0 / 0 |