Феномен привязки данных в WPF (привязка к FrameworkElement) - есть идеи почему? - PullRequest
10 голосов
/ 29 июля 2011

В моем приложении (это связано с очень динамичной навигацией и представлением контента) я должен использовать эту конструкцию в XAML:

<ContentControl Content={Binding ContentElement} />

Пока все хорошо.Это здорово, абсолютно здорово.Я могу разместить произвольные вещи повсюду.

Но, кажется, странно, ну, давайте назовем это «явлением» в WPF (я верю, что это в BindingMarkupExtension, но пока не уверен):

Когда мое свойство ContentElement выглядит следующим образом:

public FrameworkElement ContentElement
{
    get
    {
        return this.m_ContentElement;
    }
}

, тогда метод получения вызывается TWICE (!!!) для каждой операции привязки данных (это включает в себя, когда пользователь меняет язык на лету илиперезагружает управление хостингом).

Однако (и это то, что ДЕЙСТВИТЕЛЬНО смущает меня):

Когда я изменяю свое свойство ContentElement на:

public object ContentElement
{
    get
    {
        return this.m_ContentElement;
    }
}

затемПолучатель вызывается один раз.Серьезно, я не вру здесь.Это абсолютно воспроизводимо в самых простых приложениях, вы можете попробовать, например, вернуть новый «TextBlock» (это то, что я обычно делаю, чтобы проверить или узнать о более продвинутых концепциях WPF).

Есть идеи почему?

Причина, по которой я спрашиваю, состоит в том, что я ненавижу следующие последствия решения:

  • В этот момент я теряю безопасность типов
  • Это может быть довольно сложно объяснитьновым разработчикам или чересчур скептически настроенным умам

Ответы [ 2 ]

4 голосов
/ 29 июля 2011

Я смог воспроизвести его для .NET 4.0, но он не воспроизводится для того же приложения, когда вы устанавливаете .NET 3.5 framework в настройках проекта. В случае .NET 4.0 - есть 2 вызова для геттера, если его тип - FrameworkElement. Но внутренние стеки разные. Так что это определенно из-за некоторых внутренних особенностей WPF 4.0. И хорошо .. довольно сложно понять, почему и как это работает таким образом. Если позволяет время, кто-то может исследовать внутренности WPF с помощью Reflector, но я верю, что это шанс снежного кома в аду :)

0 голосов
/ 29 марта 2012

У меня была такая же проблема, и я нашел ответ от Microsoft на другом форуме: http://connect.microsoft.com/VisualStudio/feedback/details/554237/problem-binding-image-property-called-twice-for-each-item

Как сказал Креол, интересно видеть, что это было сделано в .NET 4.0.

Я не знаю, что об этом думать.Это, конечно, сделано специально, чтобы улучшить производительность или что-то в этом роде.

В нашем случае у нас есть свойство, которое возвращает представление нашей модели, и это представление будет отображаться на разных экранах, поэтому мы можем '• реализовать одно поле с оператором

if (_localValue! = null)

и создавать новый элемент управления каждый раз при получении свойства.Так что, возможно, это уже не так эффективно.

Есть еще мысли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...