在DataTemplates中绑定时,"无法找到管理FrameworkElement ..."警告

Ioa*_*cur 13 wpf warnings datatemplate

当绑定到DataTemplate内的 SolidColorBrush属性时,我在Visual Studio输出窗口中收到此警告:

System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement.BindingExpression:路径= MyColor; 的DataItem = NULL; target元素是'SolidColorBrush'(HashCode = 22943289); 目标属性是'颜色'(类型'颜色')

如果我直接绑定在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>
Run Code Online (Sandbox Code Playgroud)

我的ViewModel(TestViewModel):

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

        public TestViewModel() {

        }
  }
Run Code Online (Sandbox Code Playgroud)

更新:
它显然与绑定SolidColorBrushColor属性有关.如果我在RotateTransform对象上绑定Angle属性,则会发生同样的事情.

提前致谢.

WPF*_*-it 11

与默认数据源绑定不适DataContext用于SolidColorBrush类型,因为它们不是框架元素.此外,它们是可冻结的,您不能通过基于数据上下文的颜色绑定动态更改颜色.

您必须通过将颜色转换为纯色画笔的转换器将颜色绑定到背景填充.

 <TextBlock Background="{Binding MyColor,
                                Converter={StaticResource ColorToBrushConverter}}" />
Run Code Online (Sandbox Code Playgroud)

或者使用Color as DynamicResource并在Solid Color Brush中引用它.

ControlTemplate Storyboard颜色动画问题

  • 这不太正确 - SolidColourBrush 可能不是“FrameworkElement”,但它是“DependencyObject”,而“Color”是“DependencyProperty”。它的绑定工作正常 - 直到您处于未传递“DataContext”的上下文中。对于我想要的,我需要在样式中的“Binding”(正在基于其他颜色构建“SolidColorBrush”)中使用“DataContext”,并遇到了这个问题(无法解决;必须重新设计),但能够当将新的“SolidColorBrush”直接分配给“&lt;Grid.Background&gt;”时,可以非常愉快地绑定到 Color。 (2认同)