Почему я не могу привязать DependencyProperty к ObservableCollection?

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

    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, когда окно использовало элемент управления с таким кодом, как:

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

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

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

Любые идеи?


person Ignacio Soler Garcia    schedule 11.12.2011    source источник
comment
Любые идеи? - показать свойство Source и привязку в Xaml.   -  person Henk Holterman    schedule 11.12.2011


Ответы (2)


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

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

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

person FunnyItWorkedLastTime    schedule 11.12.2011
comment
Итак, чтобы иметь возможность привязать свойство, мне нужно объявить его как обычное свойство чтения / записи? - person Ignacio Soler Garcia; 11.12.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");
        }
        ....

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

person codeSetter    schedule 11.12.2011