Явление привязки данных в WPF (привязка к FrameworkElement) - любые идеи, почему?

В моем приложении (это связано с очень динамичной навигацией и представлением содержимого) я должен использовать эту конструкцию в 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).

Любые идеи, почему?

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

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

Ответ 1

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

Ответ 2

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

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

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

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

if (_localValue!= null)

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

Любые другие мысли?