Явление привязки данных в 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)
и должен создавать новый элемент управления каждый раз при получении свойства.
Так что это может быть не так уж и важно.
Любые другие мысли?