powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Как работает FreezableCollection?
10 сообщений из 10, страница 1 из 1
WPF: Как работает FreezableCollection?
    #39212077
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создал я некое свойство зависимости (пусть будет присоединяемое, в данном случае неважно)

Код: xml
1.
2.
3.
<my:MyExtender.MyProperty>
  <MyItem SomeProperty="5" OtherProperty="{Binding Other}" />
</my:MyExtender.MyProperty>


Работает, в том числе байндинг.
Через некоторое время захотел я в это свойство добавлять несколько элементов. Создал специальную коллекцию:

Код: xml
1.
2.
3.
4.
5.
6.
7.
<my:MyExtender.MyProperty>
  <my:MyItemCollection>
    <MyItem SomeProperty="5" OtherProperty="{Binding Other}" />
    <MyItem SomeProperty="6" OtherProperty="{Binding Other1}" />
    <MyItem SomeProperty="7" OtherProperty="{Binding Other2}" />
  </my:MyItemCollection>
</my:MyExtender.MyProperty>



В MyItemCollection (кстати, наследник Freezable) реализовал вручную интерфейс IList (ну чтоб все операции с коллекцией оставить под контролем, а именно, для добавляемых/удаляемых элементов выполнять определенные операции). Интерфейса IList достаточно для того, чтобы при разборе XAML вложенные элементы попали в коллекцию.

Эта конструкция работает, но не совсем. Свойство SomeProperty заполняется нормально, а вот Binding не работает, то есть DataContext не виден для элементов коллекции.

Начал копать - выясняется, что для такиx случаев (вложенных коллекций свойств) применяется/предназначен FreezableCollection<T> . Однако, если глянуть исходники , выясняется, что FreezableCollection<T> тупо наследует Collection<T>, не имплементирует никаких новых интерфейсов. Так почему же тогда в случае FreezableCollection<T> элементы MyItem попадают в логическое дерево, а в моем случае - нет? Неужели анализатор XAML тупо смотрит на тип объекта, а не на реализуемые им интерфейсы - это по меньшей мере странно.

Нет, ну можно, конечно, реализовать MyItemCollection на базе FreezableCollection<T> и написать обработчик CollectionChanged для внутренних нужд. Но все-таки хочется понять, как это работает. Может кто-нить объяснить простыми словами?
...
Рейтинг: 0 / 0
WPF: Как работает FreezableCollection?
    #39212100
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присоединяй через Interaction Behaviors или посмотри как там сделана эта коллекция.
...
Рейтинг: 0 / 0
WPF: Как работает FreezableCollection?
    #39212131
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПрисоединяй через Interaction Behaviorsнет смысла, если работают штатные средства.
Вопрос не в том, чтобы заставить работать (как минимум, один путь есть), а понять как это работает.
Поиск DataContext осуществляется вверх по логическому дереву. Свойство - вроде как не часть логического дерева. То есть байндер по идее заглядывает сначала в собственный элемент, потом ищет выше. Но в случае коллекции сами элементы имеют родителем коллекцию и как бы оторваны от контекста элемента (и логического дерева). Алексей Кили посмотри как там сделана эта коллекция.я дал ссылку на исходник - там ничего нет внутри, добавляется только признак frozen, не описанный никакими интерфейсами.
...
Рейтинг: 0 / 0
WPF: Как работает FreezableCollection?
    #39212342
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proпонять как это работает. Тут про это пишут.
...
Рейтинг: 0 / 0
WPF: Как работает FreezableCollection?
    #39212379
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К Тут про это пишут.спасибо, несколько яснее стало, как работает Freezable, путем введения пары терминов, которые раньше не встречались, а именно "special inheritance tree" и "inheritance context". Но этот момент я раньше воспринимал "как есть", то есть делал нужные классы наследниками Freezable.
Но в данном вопросе не освещено, как это special inheritance tree работает с FreezableCollection, учитывая, что FreezableCollection не имеет ничего интересного относительно обычной коллекции
...
Рейтинг: 0 / 0
WPF: Как работает FreezableCollection?
    #39212392
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProАлексей К Тут про это пишут.спасибо, несколько яснее стало, как работает Freezable, путем введения пары терминов, которые раньше не встречались, а именно "special inheritance tree" и "inheritance context". Но этот момент я раньше воспринимал "как есть", то есть делал нужные классы наследниками Freezable.
Но в данном вопросе не освещено, как это special inheritance tree работает с FreezableCollection, учитывая, что FreezableCollection не имеет ничего интересного относительно обычной коллекцииОфициальной документации по данному вопросу, вроде как, нет. Остаётся гадать, доверять непроверенным блогам или рыться в исходниках. :-(
...
Рейтинг: 0 / 0
WPF: Как работает FreezableCollection?
    #39212771
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КОстаётся гадатьну, в общем, погадал.

Сделал копию FreezableCollection - с ней не работает, с оригинальной FreezableCollection работает. Значит построитель пресловутого special inheritance tree ориентируется именно на конкретный класс FreezableCollection, а не на какие-то интерфейсы.
...
Рейтинг: 0 / 0
WPF: Как работает FreezableCollection?
    #39212802
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Советую таки посмотреть как сделана коллекция в Interaction.Behaviors. Хуже не будет.

Не уверен, что это те исходники, лучше декомпилировать System.Windows.Interactivity.dll соответствующей версии.
...
Рейтинг: 0 / 0
WPF: Как работает FreezableCollection?
    #39212925
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, чет-я тупанул неслабо. Это не та FreezableCollection - я не те исходники смотрел, не ожидал, что их две может быть в .NET и даже не посмотрел неймспейс. Вот правильная ссылка .

Там есть
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        /// <summary>
        ///     Freezable collections need to notify their contained Freezables
        ///     about the change in the InheritanceContext
        /// </summary>
        internal override void OnInheritanceContextChangedCore(EventArgs args)
        {
            base.OnInheritanceContextChangedCore(args);
 
            for (int i=0; i<this.Count; i++)
            {
                DependencyObject inheritanceChild = _collection[i];
                if (inheritanceChild!= null && inheritanceChild.InheritanceContext == this)
                {
                    inheritanceChild.OnInheritanceContextChanged(args);
                }
            }
        }

это как раз о многом говорит
...
Рейтинг: 0 / 0
WPF: Как работает FreezableCollection?
    #39213138
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако OnInheritanceContextChangedCore по-видимому есть только 4.5.1, но работает и без него.

FreezableCollection набита реализацией нескольких интерфейсов, плюс проверки на правильный поток, плюс всякое, наверняка необходимое презентационному ядру поведение.

Из упрямства все-таки нашел, что минимально нужно сделать для того, чтобы работал свой IList (то есть именно FreezableCollection все-таки не обязателен для презентационного ядра, но класс должен наследовать Freezable), а именно:
Код: c#
1.
2.
3.
4.
    protected override bool FreezeCore(bool isChecking)
    {
      return false;
    }

FreezableCollection в этом месте реализует обход коллекции. Также, для каждого присоединяемого элемента надо выполнить
Код: c#
1.
OnFreezablePropertyChanged(null, item)

, причем неважно, до или после того, как сама коллекция будет присоединена к вышестоящему свойству.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Как работает FreezableCollection?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]