Предупреждение «Не удается найти управляющий FrameworkElement ...» при связывании внутри шаблонов данных - PullRequest
13 голосов
/ 28 октября 2011

Я получаю это предупреждение в окне вывода Visual Studio при связывании со свойством SolidColorBrush внутри DataTemplate :

System.Windows.Data Ошибка: 2: не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: Path = MyColor; DataItem = NULL; целевым элементом является SolidColorBrush (HashCode = 22943289); Целевым свойством является «Цвет» (тип «Цвет»)

Если я связываюсь непосредственно с элементом прямоугольника, вне DataTemplate , все работает хорошо.

Может ли кто-нибудь объяснить, почему эта разница в двух, по-видимому, сходных использованиях из приведенного ниже примера кода:

My View:

<UserControl.Resources>

    <vm:TestViewModel x:Key="_myTestVM"/>

    <DataTemplate x:Key="testVMDataTemplate">
        <Grid>
            <Rectangle Height="30" Width="200" Margin="5">
                <Rectangle.Fill>
                    <SolidColorBrush Color="{Binding Path=MyColor}" />
                </Rectangle.Fill>
            </Rectangle>
        </Grid>
    </DataTemplate>
</UserControl.Resources>

<Grid>
    <StackPanel DataContext="{StaticResource _myTestVM}">
        <!-- Binding *outside* the DataTemplate = works fine -->
        <Rectangle Height="30" Width="200" Margin="5">
            <Rectangle.Fill>
                <SolidColorBrush Color="{Binding Path=MyColor}"/>
            </Rectangle.Fill>
        </Rectangle>

        <!-- Binding *inside* the DataTemplate = output warning -->    
        <ContentControl Content="{Binding}" ContentTemplate="{StaticResource testVMDataTemplate}"/>
    </StackPanel>
</Grid>

Моя ViewModel (TestViewModel):

public class TestViewModel {
    private Color _color = Colors.Green;
        public Color MyColor {
            get { return _color; }
        }

        public TestViewModel() {

        }
  }

Обновление:
Очевидно, это связано с привязкой свойства Color для SolidColorBrush . То же самое происходит, если я связываю свойство Angle для объекта RotateTransform .

Заранее спасибо.

1 Ответ

11 голосов
/ 28 октября 2011

Связывание с источником данных по умолчанию как DataContext не будет работать для типа SolidColorBrush, поскольку они не являются элементами каркаса. Кроме того, они замораживаются, и вам не разрешается динамически изменять их цвета с помощью привязки цветов на основе контекста данных.

Либо вам придется привязать цвет к фоновой заливке с помощью конвертера, который преобразует цвет в однотонную кисть.

 <TextBlock Background="{Binding MyColor,
                                Converter={StaticResource ColorToBrushConverter}}" />

Или используйте Color в качестве DynamicResource и укажите это в Solid Color Brush.

Проблема цветовой анимации раскадровки ControlTemplate

...