|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Или не биндинг. В общем, у листвью в DataContext находится коллекция, в ItemTemplate к полям привязаны ТекстБлоки через {Binding FieldName}, а одно из полей содержит список телефонов. Нужно распарсить значение, каждый телефон обернуть ссылкой и вывести в поле ListViewItem'а. Допустим, в свойстве PhonesParsed, принадлежащем коллекции, я превращаю текст телефонов в такую разметку: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Как теперь воткнуть ее в элемент с {Binding PhonesParsed}? Или это как-то совсем по-другому делается? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 14:10 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
У тебя ровно два телефона? или N? Если N - надо не StackPanel втыкать, а ItemsControl, вязать на него ItemsSource="{Binding PhonesParsed}" и делать свой ItemTemplate ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 14:23 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Зы: В случае чисто текстового контента Label отличается от TextBlock-а только наличием поддержки горячей клавиши (&). Так что если не требуется поддержка нетекстового контента или горячей клавиши - можно использовать TextBlock - он вроде как полегче. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 14:48 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Shocker.ProУ тебя ровно два телефона? или N? Если N - надо не StackPanel втыкать, а ItemsControl, вязать на него ItemsSource="{Binding PhonesParsed}" и делать свой ItemTemplateУ меня N телефонов вперемешку с текстом. Прочитал эту ссылку http://www.wpf-tutorial.com/list-controls/itemscontrol/ представление об ItemTemplate поимел. Допустим, распарсил я поле с телефонами в коллекцию, возвращаемую свойством PhonesParsed. Но там же не только лишь телефоны. Например такая последовательность: текст - номер - текст - перенос строки - текст - номер - перенос строки - номер . Стак панелями легко разбить на строки, а в гиперссылки должны заворачиваться только номера, но не текст. При генерации статической разметки в виде текста, тут проблема всего одна - воткнуть ее с помощью биндинга. Если же делать по правилам, то я это представил себе так. Допустим, каждый из типов элементов коллекции я оформлю как отдельный класс со свойством value. Тогда PhonesParsed будет возвращать набор элементов типа clsText - clsPhone - clsText - clsNewline - clsText - clsPhone - clsNewline - clsPhone Как в этом случае сделать чтобы для clsText выводился обычный Label, для clsPhone Label с гиперлинком, а по clsNewline происходил перенос строки - в соответствующем порядке? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 15:20 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
А может FlowDocument можно прикрутить? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 15:34 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Тогда тупо забабахай свой юзерконтрол, формируй в нем разметку хочешь кодом, хочешь xaml-ом, соответственно его и запихнешь в шаблон сетки. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 15:38 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
AntonariyА может FlowDocument можно прикрутить? FlowDocument работает без виртуализации вроде, при больших таблицах будет не очень быстро работать и есть множество других ограничений. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 15:40 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
AntonariyА может FlowDocument можно прикрутить?имхо, это будет тяжеловеснее, если можно обычной разметкой сделать, почему бы нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 15:40 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Shocker.ProТогда тупо забабахай свой юзерконтрол, формируй в нем разметку хочешь кодом, хочешь xaml-ом, соответственно его и запихнешь в шаблон сетки.Похоже это самый годный вариант. Соответственно, вопрос: как в юзерконтроле сформировать разметку (кодом или xaml'ом) на основании значения из биндинга? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 16:07 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
У тебя будет в разметке шаблона Код: xml 1.
Соответственно, в самом юзерконтроле в разметке у тебя уже автоматом будет нужный контекст, то есть можешь привязываться спокойно {Binding SomeProperty} или просто {Binding} (если нужно привязаться ко всему экземпляру, хранящемуся в PhonesParsed). В коде опять же ты можешь достать объект PhonesParsed из this.DataContext или также создавать кодом байндинги без указания Source (они будут основываться на вышестоящем DataContext-е) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 16:15 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
хотя... тут есть подводный камень, если не ошибаюсь. Если ты разместишь юзерконтрол в шаблоне, то обслуживать каждую строку будет его единственный экземпляр. Так что придется разместить его в ресурсе с атрибутом x:Shared="False", чтобы экземпляры были разные ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 16:21 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Shocker.Proдостать объект PhonesParsed из this.DataContextи тут еще надо понимать, что на момент создания экземпляра там может быть null, так что надо отслеживать его изменение (через OnPropertyChanged). Я бы постарался все сделать через разметку. Однако, если в принципе есть возможность все сделать через разметку, то не требовалось бы создавать и юзерконтрол ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 16:23 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Спасибо, все понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 16:33 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Как по мне, всё должно выглядеть примерно так: есть главная модель со списком неких Person'ов аля: IEnumerable<Person> Persones в классе Person, есть свойство Phones типа IEnumerable<Phone> или любое другое перечисляемое (при этом сам экземпляр может быть Observable, не важно) Теперь ты делаешь шаблон для Person и для Phone Берешь ItemsControl и ItemTemplate указываешь шаблон для Person, а в шаблон Person'а, будет свой ItemsControl с шаблона для телефонов. и еще момент, TextBlock, это не просто текстовый элемент :) это гораздо больше, у него есть замечательно свойство Inlines, в котором можно указать инлайн текстовые элементы (как раз из FlowDocument) Если быть проще: <TextBlock> <TextBlock.Inlines> <Run Text="Phone: "/> <Hyperlink Click="Dial">123123123</Hyperlink> </TextBlock.Inlines> </TextBlock> Ссылка, кстати это тоже Inline элемент :) Это кстати благоприятно скажется на производительности, если TextBlock'ов будет слишком много. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2016, 16:37 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Roman MejtesКак по мне, всё должно выглядеть примерно так: есть главная модель со списком неких Person'ов аля: IEnumerable<Person> Persones в классе Person, есть свойство Phones типа IEnumerable<Phone> или любое другое перечисляемое (при этом сам экземпляр может быть Observable, не важно) Теперь ты делаешь шаблон для Person и для Phone Берешь ItemsControl и ItemTemplate указываешь шаблон для Person, а в шаблон Person'а, будет свой ItemsControl с шаблона для телефонов.Последовал этой схеме. Шаблон для всей записи и конкретно поля с телефонами (лишнее убрал): Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
В биндинге такое свойство: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
ctlPhonesParser пока что без разметки, в нем такой код: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
По идее ctlPhonesParser должен получать строку, содержащую номер, и рисовать TextBlock.Inlines. Однако ничего с ctlPhonesParser не происходит, даже Loaded не срабатывает. Что я делаю не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2016, 10:25 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Вытащил ctlPhonesParser из ItemsControl напрямую в грид: Код: xml 1.
Контрол начал создаваться, но Me.DataContext ссылается на всю запись, а не конкретно на свойство PhonesParsed. По идее контролу незачем знать имя свойства, ибо если вдруг оно сменит название, то код Me.DataContext.PhonesParsed перестанет работать. Что-то с ItemsControl не так, хотелось бы ctlPhonesParser.DataContext связать с элементом коллекции PhonesParsed, а не всей записью контакта. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2016, 11:32 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
не пытайся сам менять DataContext, я за все годы работы с WPF практически ни разу не пользовался этим свойством. Если кто то пытается, что то делать через свойство DataContext, значит он что то делает неправильно. контекст данных должен сам автоматически наследоваться и переопределяться. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2016, 11:50 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Да я не меняю его, мне прочитать нужно, чтобы получить и распарсить строку и сгенерить на ее основе разметку. Собственно, два вопроса у меня: 1) почему не работает ItemsControl? 2) Как сделать, чтобы DataConext возвращал свойство, а не весь объект? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2016, 12:07 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
выложи больше кода, больше XAML интересует, не понятно, где от куда ноги растут. Попробуй ListView заменить на ItemsControl\ListBox Опиши точно и чётко ТЗ, я тебе скину пример по нему. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2016, 12:15 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Roman Mejtes, Со вторым вопросом разобрался. По первому вопросу: код Код: 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. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Код: 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.
В листвью нужно отобразить список контактов - ObservableCollection(Of DirectoryEntry). В одной из ячеек в каждой строке списка контактов нужно отобразить список телефонов, связанных с контактом - List(Of String) Каждый телефон должен отобразиться в экземпляре ctlPhonesParser, разметка которого будет создана динамически. Проблема: экземпляры ctlPhonesParser, размещенные в ItemsControl, не создаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2016, 12:47 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Все, разобрался. Нужно было так сделать: Код: xml 1. 2. 3. 4. 5. 6. 7.
Почему-то в текстовых примерах в справочниках, что я смотрел, свойство ItemsSource не использовалось, и типа на словах все работало. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2016, 13:05 |
|
WPF сложный биндинг
|
|||
---|---|---|---|
#18+
Antonariy, DataContext="{Binding}" - абсолютно бессмысленное действо, это связывание нужно удалить ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2016, 13:47 |
|
|
start [/forum/topic.php?fid=21&fpage=12&tid=1440695]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 175ms |
0 / 0 |