我有一个由我自己完成的usercontrol,它有一个依赖属性是一个集合:
private static readonly DependencyPropertyKey VerticalLinesPropertyKey = DependencyProperty.RegisterReadOnly("VerticalLines", typeof(VerticalLineCollection), typeof(DailyChart), new FrameworkPropertyMetadata(new VerticalLineCollection()));
public static DependencyProperty VerticalLinesProperty = VerticalLinesPropertyKey.DependencyProperty;
public VerticalLineCollection VerticalLines
{
get
{
return (VerticalLineCollection)base.GetValue(VerticalLinesProperty);
}
set
{
base.SetValue(VerticalLinesProperty, value);
}
}
当Window使用控件时,我直接从XAML填充此集合,代码如下:
<chart:DailyChart.VerticalLines>
<VerticalLine ... ... ... />
</chart:DailyChart.VerticalLines>
现在,我从XAML中删除了这个固定的初始化,我想将集合绑定到ViewModel的属性,但是我收到了错误:
Error 1 'VerticalLines' property cannot be data-bound.
Parameter name: dp
有什么想法吗?
答案 0 :(得分:2)
在您的XAML示例中,解析器看到VerticalLineCollection
类型实现IList
,因此对于每个指定的VerticalLine
,将创建一个VerticalLine
对象,然后调用{{1收集本身。
但是,当您尝试绑定集合时,语义变为“将新集合分配给Add
属性”,由于这是一个只读的依赖项属性,因此无法完成。您的属性上的setter实际上应该标记为私有,这样做会产生编译时错误。
希望这有帮助!
答案 1 :(得分:0)
我想这是因为(True read-only dependency property)。
由于您只读了属性,因此可以将其更改为
private static readonly DependencyPropertyKey VerticalLinesPropertyKey = DependencyProperty.Register("VerticalLines", typeof(VerticalLineCollection), typeof(DailyChart), new FrameworkPropertyMetadata(new VerticalLineCollection()));
public static DependencyProperty VerticalLinesProperty = VerticalLinesPropertyKey.DependencyProperty;
Reflector给出答案:
internal static BindingExpression CreateBindingExpression(DependencyObject d, DependencyProperty dp, Binding binding, BindingExpressionBase parent)
{
FrameworkPropertyMetadata fwMetaData = dp.GetMetadata(d.DependencyObjectType) as FrameworkPropertyMetadata;
if (((fwMetaData != null) && !fwMetaData.IsDataBindingAllowed) || dp.ReadOnly)
{
throw new ArgumentException(System.Windows.SR.Get(System.Windows.SRID.PropertyNotBindable, new object[] { dp.Name }), "dp");
}
....
希望这会起作用