Связывание в стиле WPF вызывает необъяснимую ошибку "Не удается найти управляющую систему Framework"
У меня есть ItemsControl
, который отображает кучу прямоугольников. Каждый прямоугольник должен быть смещен вверх и влево. Итак, я создал RectangleStyle
, который использует привязки для установки ширины, высоты, X-перевода и перевода Y для прямоугольника.
Связи ширины и высоты работают нормально, но я получаю следующую ошибку для привязок TranslateTransform
:
Ошибка System.Windows.Data: 2: Не удается найти управляющий элемент FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: Path = offset.x; DataItem = NULL; целевым элементом является "TranslateTransform" (HashCode = 16452547); target является "X" (тип "Double" )
Вот определение my ItemControl
:
<ItemsControl
Style="{StaticResource ItemsControlStyle}"
ItemsSource="{Binding Zones}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Style="{StaticResource RectangleStyle}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Вот определение ItemsControlStyle
:
<Style x:Key="ItemsControlStyle" TargetType="ItemsControl">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Point.X}" />
<Setter Property="Canvas.Top" Value="{Binding Point.Y}" />
</Style>
</Setter.Value>
</Setter>
</Style>
И вот определение RectangleStyle
:
<Style x:Key="RectangleStyle" TargetType="Rectangle">
<Setter Property="Width" Value="{Binding Size.Width}" />
<Setter Property="Height" Value="{Binding Size.Height}" />
<Setter Property="RenderTransform">
<Setter.Value>
<!-- these bindings are causing the error -->
<TranslateTransform X="{Binding Offset.X}" Y="{Binding Offset.Y}" />
</Setter.Value>
</Setter>
</Style>
Две привязки в RenderTransform
setter RectangleStyle
являются причиной ошибки, но я не уверен, что делать, чтобы исправить проблему. Интересно, что графика переводится правильно, поэтому WPF способен разрешать привязки - по некоторым причинам они просто не довольны.
Что я могу сделать, чтобы исправить привязки?
Edit
Я отправил отчет об ошибке в MS Connect:
https://connect.microsoft.com/VisualStudio/feedback/details/746840/misleading-cannot-find-governing-frameworkelement-error-message-appears-in-output-window
Ответы
Ответ 1
Я также не могу объяснить, почему возникает сообщение об ошибке, но я обнаружил, что добавление свойства x: Name в преобразование - способ избавиться от сообщения об ошибке:
<TranslateTransform x:Name="myTransform" X="{Binding Offset.X}" Y="{Binding Offset.Y}" />
Ответ 2
Я думаю, что нашел полезную информацию.
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/db050ce6-d084-41ad-9a31-c01831687683
Ответ на это, по-видимому, содержится в объяснении Microsoft поведения, поскольку ItemsControl проходит через процесс компоновки и применяет привязки и стили. То есть WPF пытается оптимизировать ваш DataTemplate, прежде чем он будет иметь источник данных для успешной оценки привязок: "dataitem = null". В каждом другом экземпляре во время прохождения макета "dataitem" указывает на что-то в вашем "Zones" IEnumerable и может завершить привязки. В противном случае вы увидите ошибку с каждым элементом в своей коллекции, а не только за одно свойство.
Кажется, что "не обращают внимания на человека за занавеской". Вероятно, он должен быть добавлен в MS Connect как отчет об ошибке; успешный код не должен вызывать "ошибки", которые не имеют значения. Но я оставлю это вам, чтобы указать это с помощью MS Connect, если хотите.
Ответ 3
Прочитав ответ Роб Перкинса, я добавил FallbackValue к связыванию с этой проблемой. Это очистило ошибку для меня.