|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
PhonesParsed это массив строк, который является свойством класса Contact, соответственно в контексте ctlPhonesParser находится строка. Как добраться до Contact, который находится в контексте StackPanel, отсюда: Код: vbnet 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2016, 13:45 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
В своем время пытался погуглить, можно ли как-то получить датаконтекст иначе, то ли не смог найти, то ли нельзя, в итоге сам накропал Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2016, 13:48 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Примерно так же я уже делал, думал есть другой способ. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2016, 14:01 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Не понял смысла этой процедуры, для текущего элемента она возвращает его же контекст, который и так известен. Написал свой вариант: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2016, 15:02 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Рекомендую в самом классе ctlPhonesParser создать свойство и назначить binding. Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2016, 15:11 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
у меня часто возникали раньше такие проблемы, потом стал более тщательно продумывать ViewModel, то есть для элемента ItemsControl'а все свойства должны быть определены в нём самом, если я хочу это отразить во View. А для передачи команд из списка (если у элемента списка есть кнопка) существуют RoutedCommand. Внешний вид элемента списка задается с помощью шаблона данных (DataTemplate), а это значит, что все состояния которые будет иметь этот элемент должны быть уже определены в модели представления этого элемента, чтоб не было необходимости пытаться дёргать контекст данных другого элемента через жопу. По этому, возникает вопрос, почему у вас возникла такая необходимость, пример в студию (хотя бы примерный) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2016, 17:26 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Архитектура у меня далека от идеального MVVM. Вот полный код контрола: Код: vbnet 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.
Вариант Ильи в данном случае похоже наиболее корректный. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2016, 18:04 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Roman Mejtesпочему у вас возникла такая необходимостьУ меня необходимость возникла в следующем случае. Мне понадобилось ListBoxItem.IsSelected связать со свойством ViewModel для ListBoxItem-а. То есть чтобы VM конкретного элемента списка знала, выбрана она сейчас в списке или нет (а также отслеживать момент включения-выключения). То есть в ItemTemplate мне нужна была бы связка: Код: plaintext
при том, что IsSelected в VM не является DependencyProperty. Я решил вопрос через AttachedProperty, но, соответственно, хендлеру требуется найти DataContext, чтобы изменить в нем нужное свойство. Что-то не смог придумать другого решения, тебе приходилось этот вопрос решать? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2016, 19:57 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Shocker.ProRoman Mejtesпочему у вас возникла такая необходимостьУ меня необходимость возникла в следующем случае. Мне понадобилось ListBoxItem.IsSelected связать со свойством ViewModel для ListBoxItem-а. То есть чтобы VM конкретного элемента списка знала, выбрана она сейчас в списке или нет (а также отслеживать момент включения-выключения). То есть в ItemTemplate мне нужна была бы связка: Код: plaintext
при том, что IsSelected в VM не является DependencyProperty. Я решил вопрос через AttachedProperty, но, соответственно, хендлеру требуется найти DataContext, чтобы изменить в нем нужное свойство. Что-то не смог придумать другого решения, тебе приходилось этот вопрос решать? у ListBoxItem.IsSelected свойство зависимости, зачем в VM еще одно? Код: xml 1. 2. 3.
учти, есть момент с виртуализацией, в 1 моменет времени существуют только ListBoxItem'ы области видимости + CurrentItem\SelectedItems ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2016, 20:03 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Код: xml 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2016, 20:04 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Спасибо. Но ведь стиль придется прописать минимум на уровне ресурсов листбокса, то есть нельзя реализовать в пределах шаблона данных для ListItem-а... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2016, 00:13 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Shocker.Pro, этому и не месте в шаблоне, шаблон отображается внутри ListBoxItem, в соответствующем ContentPresenter'ом, он знать не должен о том, что существует какой то там ListBoxItem. У тебя есть шаблон CountryTemplate (к примеру), ты используешь его повсеместно, где нужно отобразить сущности соответствующего типа, всё остальное делается на уровне свойств контролов. Если при выделении IsSelected=True нужно менять цвет (к примеру), то менять его стоит на уровне контрола, а не шаблона. Шаблон должен быть универсальный\абстрактным от контекста (где он находится) и применим везде где встречаются сущности заданного типа, который он визуализирует. Как он будет выглядеть ListBoxItem в разных состояниях, ты определяешь через стили, шаблоны, конверторы\DP. Не задевая сам шаблон. то есть в DataTemplate'е использовать RelativeSource вообще не стоит, в DataTemplate лучше использовать только обычный Binding к Content'у Presenter'а (ну за исключением тех относительных источников, которые находится в рамках шаблона) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2016, 13:45 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
И сама VM, и шаблон предполагают исключительное использование в контексте ListBoxItem, внешний вид его зависит от IsSelected, в частности появляются кнопки манипулирования, возможности перевода в режим редактирования и т.п. При этом при переключении IsSelected в False (пользователь кликнул по другому элементу) мне нужно выполнять код внутри VM (cвязанный с переключением режимов редактирования). То есть работа с IsSelected является неотъемлемой частью данного шаблона, без него он не имеет смысла. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2016, 14:04 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Shocker.ProИ сама VM, и шаблон предполагают исключительное использование в контексте ListBoxItem, внешний вид его зависит от IsSelected, в частности появляются кнопки манипулирования, возможности перевода в режим редактирования и т.п. При этом при переключении IsSelected в False (пользователь кликнул по другому элементу) мне нужно выполнять код внутри VM (cвязанный с переключением режимов редактирования). То есть работа с IsSelected является неотъемлемой частью данного шаблона, без него он не имеет смысла. Через стиль ListBoxItem связываешь свойство ListBoxItem.IsSelected с ViewModel.IsSelected, в шаблоне обращаешься только к свойству ViewModel. Если в ViewModel.IsSelected, должно даже без OnPropertyChanged(nameof(IsSelected)), работать нормально. Код: xml 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2016, 14:11 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Roman MejtesЧерез стиль ListBoxItem связываешь свойство ListBoxItem.IsSelected с ViewModel.IsSelectedНу, собственно, об этом ты писал выше. Просто я хотел избежать определения дополнительной связки вне шаблона ListItem-а, и именно это у меня и не получилось без поиска DataContext-а. Roman Mejtesучти, есть момент с виртуализацией, в 1 моменет времени существуют только ListBoxItem'ы области видимости + CurrentItem\SelectedItemsА где тут грабли? Ведь VM же все равно существуют для всех элементов списка. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2016, 14:26 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
Shocker.ProRoman MejtesЧерез стиль ListBoxItem связываешь свойство ListBoxItem.IsSelected с ViewModel.IsSelectedНу, собственно, об этом ты писал выше. Просто я хотел избежать определения дополнительной связки вне шаблона ListItem-а, и именно это у меня и не получилось без поиска DataContext-а. Roman Mejtesучти, есть момент с виртуализацией, в 1 моменет времени существуют только ListBoxItem'ы области видимости + CurrentItem\SelectedItemsА где тут грабли? Ведь VM же все равно существуют для всех элементов списка. косяк в том, что если ты делаешь View, то для того, чтоб изменить свойство ListBoxItem, невидимого элемента (который находится за областью видимости), нужно сделать так, чтоб он попал в области видимости (прокрутить) и только потом менять, иначе ItemGenerator вернёт null и ты ни чего не поменяешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2016, 14:36 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
А, понял. Ну в моем случае я не меняю IsSelected со стороны модели, это прерогатива пользователя. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2016, 14:43 |
|
Добраться до DataContext верхнего уровня.
|
|||
---|---|---|---|
#18+
В итоге я сделал некий универсальный экстеншен, позволяющий связать между собой два байндинга, то есть так: Код: xml 1. 2.
Таким образом я избавился от поиска DataContext-а, хотя и использовал не нравящийся тебе RelativeSource, но, как я уже говорил, шаблон строго завязан на ListBox, так что тут не вижу ничего страшного. А PropertyBridge, полагаю, пригодится не только тут )) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2016, 16:19 |
|
|
start [/forum/topic.php?fid=21&fpage=12&tid=1440666]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 235ms |
total: | 383ms |
0 / 0 |