0

我有一个自己完成的用户控件,它有一个依赖属性,它是一个集合:

    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

有任何想法吗?

4

2 回答 2

2

在您的 XAML 示例中,解析器看到该VerticalLineCollection类型实现IList,因此对于每个指定VerticalLine的将创建一个VerticalLine对象,然后调用Add集合本身。

但是,当您尝试绑定集合时,语义变为“将新集合分配给VerticalLines属性”,这是无法完成的,因为这是一个只读依赖属性。你的属性上的 setter 确实应该被标记为私有的,这样做你会得到一个编译时错误。

希望这可以帮助!

于 2011-12-11T19:02:01.713 回答
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;

反射器给出了答案:

    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");
        }
        ....

希望这会奏效

于 2011-12-11T19:15:23.570 回答