Почему я не могу привязать свойство DependencyProperty к ObservableCollection? - PullRequest
0 голосов
/ 11 декабря 2011

У меня есть пользовательский контроль, который имеет свойство зависимости, представляющее собой коллекцию:

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

Я заполнял эту коллекцию непосредственно из XAML, когда Window использовал элемент управления с кодом, подобным:

<chart:DailyChart.VerticalLines>
    <VerticalLine ... ... ... />
</chart:DailyChart.VerticalLines>

Теперь я удалил эту фиксированную инициализацию из XAML и хочу связать коллекцию со свойством ViewModel, но я получаю ошибку:

Error   1   'VerticalLines' property cannot be data-bound.
Parameter name: dp

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

В вашем примере XAML анализатор видит, что тип VerticalLineCollection реализует IList и, следовательно, для каждого указанного VerticalLine создаст объект VerticalLine и затем вызовет Add для самой коллекции.

Однако при попытке связать коллекцию семантика становится «назначить новую коллекцию свойству VerticalLines», что невозможно, поскольку это свойство зависимости только для чтения. Установщик вашего свойства действительно должен быть помечен как приватный, и при этом вы получите ошибку времени компиляции.

Надеюсь, это поможет!

0 голосов
/ 11 декабря 2011

Я думаю, это из-за (Истинное свойство зависимости только для чтения) .

Поскольку у вас есть свойство только для чтения, вы можете изменить его на

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

Надеюсь, это сработает

...