|
WPF: Как работает FreezableCollection?
|
|||
---|---|---|---|
#18+
Создал я некое свойство зависимости (пусть будет присоединяемое, в данном случае неважно) Код: xml 1. 2. 3.
Работает, в том числе байндинг. Через некоторое время захотел я в это свойство добавлять несколько элементов. Создал специальную коллекцию: Код: xml 1. 2. 3. 4. 5. 6. 7.
В MyItemCollection (кстати, наследник Freezable) реализовал вручную интерфейс IList (ну чтоб все операции с коллекцией оставить под контролем, а именно, для добавляемых/удаляемых элементов выполнять определенные операции). Интерфейса IList достаточно для того, чтобы при разборе XAML вложенные элементы попали в коллекцию. Эта конструкция работает, но не совсем. Свойство SomeProperty заполняется нормально, а вот Binding не работает, то есть DataContext не виден для элементов коллекции. Начал копать - выясняется, что для такиx случаев (вложенных коллекций свойств) применяется/предназначен FreezableCollection<T> . Однако, если глянуть исходники , выясняется, что FreezableCollection<T> тупо наследует Collection<T>, не имплементирует никаких новых интерфейсов. Так почему же тогда в случае FreezableCollection<T> элементы MyItem попадают в логическое дерево, а в моем случае - нет? Неужели анализатор XAML тупо смотрит на тип объекта, а не на реализуемые им интерфейсы - это по меньшей мере странно. Нет, ну можно, конечно, реализовать MyItemCollection на базе FreezableCollection<T> и написать обработчик CollectionChanged для внутренних нужд. Но все-таки хочется понять, как это работает. Может кто-нить объяснить простыми словами? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2016, 23:52 |
|
WPF: Как работает FreezableCollection?
|
|||
---|---|---|---|
#18+
Присоединяй через Interaction Behaviors или посмотри как там сделана эта коллекция. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2016, 05:26 |
|
WPF: Как работает FreezableCollection?
|
|||
---|---|---|---|
#18+
Алексей КПрисоединяй через Interaction Behaviorsнет смысла, если работают штатные средства. Вопрос не в том, чтобы заставить работать (как минимум, один путь есть), а понять как это работает. Поиск DataContext осуществляется вверх по логическому дереву. Свойство - вроде как не часть логического дерева. То есть байндер по идее заглядывает сначала в собственный элемент, потом ищет выше. Но в случае коллекции сами элементы имеют родителем коллекцию и как бы оторваны от контекста элемента (и логического дерева). Алексей Кили посмотри как там сделана эта коллекция.я дал ссылку на исходник - там ничего нет внутри, добавляется только признак frozen, не описанный никакими интерфейсами. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2016, 08:23 |
|
WPF: Как работает FreezableCollection?
|
|||
---|---|---|---|
#18+
Shocker.Proпонять как это работает. Тут про это пишут. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2016, 11:20 |
|
WPF: Как работает FreezableCollection?
|
|||
---|---|---|---|
#18+
Алексей К Тут про это пишут.спасибо, несколько яснее стало, как работает Freezable, путем введения пары терминов, которые раньше не встречались, а именно "special inheritance tree" и "inheritance context". Но этот момент я раньше воспринимал "как есть", то есть делал нужные классы наследниками Freezable. Но в данном вопросе не освещено, как это special inheritance tree работает с FreezableCollection, учитывая, что FreezableCollection не имеет ничего интересного относительно обычной коллекции ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2016, 11:49 |
|
WPF: Как работает FreezableCollection?
|
|||
---|---|---|---|
#18+
Shocker.ProАлексей К Тут про это пишут.спасибо, несколько яснее стало, как работает Freezable, путем введения пары терминов, которые раньше не встречались, а именно "special inheritance tree" и "inheritance context". Но этот момент я раньше воспринимал "как есть", то есть делал нужные классы наследниками Freezable. Но в данном вопросе не освещено, как это special inheritance tree работает с FreezableCollection, учитывая, что FreezableCollection не имеет ничего интересного относительно обычной коллекцииОфициальной документации по данному вопросу, вроде как, нет. Остаётся гадать, доверять непроверенным блогам или рыться в исходниках. :-( ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2016, 11:58 |
|
WPF: Как работает FreezableCollection?
|
|||
---|---|---|---|
#18+
Алексей КОстаётся гадатьну, в общем, погадал. Сделал копию FreezableCollection - с ней не работает, с оригинальной FreezableCollection работает. Значит построитель пресловутого special inheritance tree ориентируется именно на конкретный класс FreezableCollection, а не на какие-то интерфейсы. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2016, 16:03 |
|
WPF: Как работает FreezableCollection?
|
|||
---|---|---|---|
#18+
Советую таки посмотреть как сделана коллекция в Interaction.Behaviors. Хуже не будет. Не уверен, что это те исходники, лучше декомпилировать System.Windows.Interactivity.dll соответствующей версии. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2016, 16:19 |
|
WPF: Как работает FreezableCollection?
|
|||
---|---|---|---|
#18+
Ой, чет-я тупанул неслабо. Это не та FreezableCollection - я не те исходники смотрел, не ожидал, что их две может быть в .NET и даже не посмотрел неймспейс. Вот правильная ссылка . Там есть Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
это как раз о многом говорит ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2016, 18:07 |
|
WPF: Как работает FreezableCollection?
|
|||
---|---|---|---|
#18+
Однако OnInheritanceContextChangedCore по-видимому есть только 4.5.1, но работает и без него. FreezableCollection набита реализацией нескольких интерфейсов, плюс проверки на правильный поток, плюс всякое, наверняка необходимое презентационному ядру поведение. Из упрямства все-таки нашел, что минимально нужно сделать для того, чтобы работал свой IList (то есть именно FreezableCollection все-таки не обязателен для презентационного ядра, но класс должен наследовать Freezable), а именно: Код: c# 1. 2. 3. 4.
FreezableCollection в этом месте реализует обход коллекции. Также, для каждого присоединяемого элемента надо выполнить Код: c# 1.
, причем неважно, до или после того, как сама коллекция будет присоединена к вышестоящему свойству. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2016, 01:35 |
|
|
start [/forum/topic.php?fid=21&fpage=12&tid=1440705]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 239ms |
total: | 375ms |
0 / 0 |