Подтвердить что ты не робот

Связывание в стиле 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

4b9b3361

Ответ 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 к связыванию с этой проблемой. Это очистило ошибку для меня.