Есть коллекция объектов, представляющих собой параметры некоторого контрола, который расположен на вкладках TabControl'а.
В разметке XAML к данной коллекции привязывается ItemsSource TabControl'а через класс, реализующий интерфейс IValueConverter.
Всё работает, но при изменении содержимого коллекции (добавлении нового объекта) не срабатывает привязка.
Как только исключаю из привязки конвертер, сразу ситуация исправляется.
Т.е. при использовании конвертера создаётся коллекция TabItem'ов, и уже к ней привязывается ItemsSource, а не к источнику, указанному в привязке.
Как сделать так, чтобы привязка с использованием конвертера срабатывала при изменении источника, указанного в привязке.
Здравствуйте, dx.dash, Вы писали:
DD>Есть коллекция объектов, представляющих собой параметры некоторого контрола, который расположен на вкладках TabControl'а. DD>В разметке XAML к данной коллекции привязывается ItemsSource TabControl'а через класс, реализующий интерфейс IValueConverter. DD>Всё работает, но при изменении содержимого коллекции (добавлении нового объекта) не срабатывает привязка. DD>Как только исключаю из привязки конвертер, сразу ситуация исправляется. DD>Т.е. при использовании конвертера создаётся коллекция TabItem'ов, и уже к ней привязывается ItemsSource, а не к источнику, указанному в привязке. DD>Как сделать так, чтобы привязка с использованием конвертера срабатывала при изменении источника, указанного в привязке.
Слежение за изменением коллекции реализовано на уровне ItemsControl, а не Binding. Т.к. ItemsControl получает значение на выходе из конвертера, то вполне логично, что он не парится по поводу исходной коллекции. Меня вот что беспокоит, для чего здесь вообще конвертер, ведь TabControl сам может формировать TabItem-ы?
Re[2]: [WPF 3.5] Binding с использованием конвертера
Здравствуйте, dx.dash, Вы писали:
MM>>Меня вот что беспокоит, для чего здесь вообще конвертер, ведь TabControl сам может формировать TabItem-ы? DD>, из которой конвертер делает набор панелей определённого вида, которые уже вставляет в коллекцию TabItem'ов
А почему нельзя всё это представить через DataTemplate? На каждое направление создается TabItem, в нем TextBlock с наименованием и ItemsControl для перечисления станций...
Re[4]: [WPF 3.5] Binding с использованием конвертера
Здравствуйте, MxMsk, Вы писали:
MM>А почему нельзя всё это представить через DataTemplate? На каждое направление создается TabItem, в нем TextBlock с наименованием и ItemsControl для перечисления станций...
Потому, что для отображения станций используется контрол, производный от UserControl, и в нём нет свойства ItemsSource. Реализовать его как ItemsControl было бы просто замечательно, но сейчас на это нет ни времени, ни опыта.
Но вообще — да, так изначально и было задумано.
Re[5]: [WPF 3.5] Binding с использованием конвертера
Здравствуйте, dx.dash, Вы писали:
MM>>А почему нельзя всё это представить через DataTemplate? На каждое направление создается TabItem, в нем TextBlock с наименованием и ItemsControl для перечисления станций...
DD>Потому, что для отображения станций используется контрол, производный от UserControl, и в нём нет свойства ItemsSource. Реализовать его как ItemsControl было бы просто замечательно, но сейчас на это нет ни времени, ни опыта. DD>Но вообще — да, так изначально и было задумано.
Пускай нет. Как-то же ему список станций все-равно подсовывается. Неужто нельзя нечто сделать подобное:
SizeableTabControl — немного изменённый TabControl с возможностью изменения размера панели вкладок GridSplitter'ом
SStackPanel — тот самый UserControl
в общем как-то так... не работает. Да, вкладки с направлениями создаются, но не более.
Re[7]: [WPF 3.5] Binding с использованием конвертера
DD>SizeableTabControl — немного изменённый TabControl с возможностью изменения размера панели вкладок GridSplitter'ом DD>SStackPanel — тот самый UserControl DD>в общем как-то так... не работает. Да, вкладки с направлениями создаются, но не более.
Гляди, ты задаешь, что SStackPanel.Items следует брать из списка "Станции". А в шаблоне SStackPanel.Template ты почему-то указываешь l:ПанельСтанции, что станция — это {Binding}. Есть подозрение, что здесь нестыковка. И, кстати, все ошибки привязки пишутся в окно Output, посмотри туда, может там будет сообщение о не сработавшем binding-е.
Re[8]: [WPF 3.5] Binding с использованием конвертера
Здравствуйте, MxMsk, Вы писали:
MM>Гляди, ты задаешь, что SStackPanel.Items следует брать из списка "Станции". А в шаблоне SStackPanel.Template ты почему-то указываешь l:ПанельСтанции, что станция — это {Binding}. Есть подозрение, что здесь нестыковка. И, кстати, все ошибки привязки пишутся в окно Output, посмотри туда, может там будет сообщение о не сработавшем binding-е.
А шаблон SStackPanel я указал просто как единственно доступный в этом контроле. Но мне нужен не Template, а ItemTemplate, а соответственно SStackPanel производный от ItemsControl, что пока не удаётся сделать по указанным в сообщении выше причинам.
Re[9]: [WPF 3.5] Binding с использованием конвертера
Здравствуйте, dx.dash, Вы писали:
DD>А шаблон SStackPanel я указал просто как единственно доступный в этом контроле. Но мне нужен не Template, а ItemTemplate, а соответственно SStackPanel производный от ItemsControl, что пока не удаётся сделать по указанным в сообщении выше причинам.
Хорошо, а как тогда этот SStackPanel вообще настраивается? Как-то же ему задается, что показывать...
Re[10]: [WPF 3.5] Binding с использованием конвертера
Здравствуйте, MxMsk, Вы писали:
MM>Хорошо, а как тогда этот SStackPanel вообще настраивается? Как-то же ему задается, что показывать...
SStackPanel показывает коллекцию UIElement, которая записывается в SStackPanel.Items. Шаблон для отображаемых элементов я настроить не могу. Приходится использовать конвертер.
Re[11]: [WPF 3.5] Binding с использованием конвертера
Здравствуйте, dx.dash, Вы писали:
DD>Здравствуйте, MxMsk, Вы писали: MM>>Хорошо, а как тогда этот SStackPanel вообще настраивается? Как-то же ему задается, что показывать... DD>SStackPanel показывает коллекцию UIElement, которая записывается в SStackPanel.Items. Шаблон для отображаемых элементов я настроить не могу. Приходится использовать конвертер.
Ах вот оно что... Тогда могу посоветовать два варианта. Нет, три! Нормально переписать контрол, но это видимо нельзя, да
Написать свою коллекцию. Эта коллекция должна поддерживать INotifyCollectionChanged и сама должна следить за изменением источника данных. Эту коллекцию будет возвращать конвертер.
В самой модели данных сделать так, что при изменении состава коллекции, она будет полностью пересоздаваться и оповещать об изменении свойства. Тогда на это сможет реагировать Binding.
Re[12]: [WPF 3.5] Binding с использованием конвертера