当在DataTemplate:
中绑定SolidColorBrush属性时,我在Visual Studio输出窗口中得到这个警告System.Windows。数据错误:2:找不到目标元素的框架元素或框架内容元素。BindingExpression:路径= MyColor;DataItem =零;目标元素是"SolidColorBrush"(HashCode=22943289);目标属性为"Color"(类型为"Color")
如果我直接绑定在矩形元素上,在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() {
}
}
更新:
它显然与绑定SolidColorBrush的Color属性有关。如果我在RotateTransform对象上绑定Angle属性,也会发生同样的事情。
将默认数据源绑定为DataContext
对SolidColorBrush
类型不起作用,因为它们不是框架元素。另外,它们是可冻结的,你不能通过基于数据上下文的颜色绑定来动态地改变它们的颜色。
要么你必须通过转换器将颜色转换为纯色画笔将颜色绑定到背景填充。
<TextBlock Background="{Binding MyColor,
Converter={StaticResource ColorToBrushConverter}}" />
或使用颜色为DynamicResource
,并参考纯色画笔
ControlTemplate Storyboard颜色动画问题