Привязка в стиле WPF вызывает необъяснимую ошибку «Не удается найти управляющий FrameworkElement» - PullRequest
22 голосов
/ 06 июля 2010

У меня есть ItemsControl, который отображает группу прямоугольников. Каждый прямоугольник должен быть смещен вверх и влево. Итак, я создал RectangleStyle, который использует привязки, чтобы установить ширину, высоту, X-перевод и Y-перевод для прямоугольника.

Привязки ширины и высоты работают нормально, но я получаю следующую ошибку для привязок TranslateTransform:

System.Windows.Data Ошибка: 2: не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: Path = offset.x; DataItem = NULL; Целевым элементом является TranslateTransform (HashCode = 16452547); целевое свойство 'X' (тип 'Double')

Вот определение моего 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 установщика RectangleStyle, но я не уверен, что нужно сделать, чтобы решить эту проблему. Интересно, что графика переводится должным образом, поэтому WPF может разрешать привязки - просто по какой-то причине им это не нравится.

Что я могу сделать, чтобы исправить привязки?


Редактировать

Я отправил сообщение об ошибке в MS Connect:

https://connect.microsoft.com/VisualStudio/feedback/details/746840/misleading-cannot-find-governing-frameworkelement-error-message-appears-in-output-window

Ответы [ 3 ]

49 голосов
/ 03 октября 2011

Я также не могу объяснить, почему появляется сообщение об ошибке, но я обнаружил, что добавление свойства x: Name в преобразование - это способ избавиться от сообщения об ошибке:

<TranslateTransform x:Name="myTransform" X="{Binding Offset.X}" Y="{Binding Offset.Y}" /> 
9 голосов
/ 07 июля 2010

Мне кажется, я нашел некоторую полезную информацию.

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/db050ce6-d084-41ad-9a31-c01831687683

Ответ на этот вопрос, по-видимому, содержится в объяснении Microsoft о поведении, поскольку ItemsControl проходит процесс компоновки и применяетпривязки и стили.То есть WPF пытается оптимизировать ваш DataTemplate до того, как у него будет источник данных, чтобы успешно оценить привязки: «dataitem = null».Во всех остальных случаях во время прохождения макета «dataitem» указывает на что-то в ваших «зонах» IEnumerable, и он может завершать привязки.В противном случае вы увидите ошибку с каждым элементом в вашей коллекции, а не один раз для каждого свойства.

Кажется, это вещь типа "не обращай внимания на человека за занавесом".И, вероятно, его следует добавить в MS Connect как отчет об ошибке;успешный код не должен выводить «ошибки», которые не имеют значения.Но я оставлю это вам, чтобы подать это в MS Connect, если хотите.

1 голос
/ 24 апреля 2015

Прочитав ответ Роба Перкинса, я добавил FallbackValue в привязку с этой проблемой.Это очистило ошибку для меня.

...