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

Предупреждение "Не удается найти управляющее FrameworkElement..." при привязке внутри DataTemplates

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

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

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

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

Мой вид:

<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>

My ViewModel (TestViewModel):

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

        public TestViewModel() {

        }
  }

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

Спасибо заранее.

4b9b3361

Ответ 1

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

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

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

Или используйте цвет как DynamicResource и обратитесь к этому в Solid Color Brush.

Проблема цветовой анимации ControlTemplate Storyboard