2012-04-05 25 views
6

Tôi có một hệ thống phân cấp lớp như sau và ràng buộc với thuộc tính VisibleRange đang ném vào trình thiết kế.Chỉ có thể đặt ràng buộc trên DependencyProperty của DependencyObject - khi thuộc tính được ghi đè bằng

Với lớp thứ bậc ở đây:

// Base class 
public abstract class AxisBase : ContentControl, IAxis 
{ 
    public static readonly DependencyProperty VisibleRangeProperty = DependencyProperty.Register(
     "VisibleRange", typeof(IRange), typeof(AxisBase), 
     new PropertyMetadata(default(IRange), OnVisibleRangeChanged)); 

    public IRange VisibleRange 
    { 
     get { return (IRange)GetValue(VisibleRangeProperty); } 
     set { SetValue(VisibleRangeProperty, value); } 
    } 
} 

// Derived class 
public class DateTimeAxis : AxisBase 
{ 
     public new IRange<DateTime> VisibleRange 
     { 
      get { return (IRange<DateTime>)GetValue(VisibleRangeProperty); } 
      set { SetValue(VisibleRangeProperty, value); } 
     } 
} 

// And interface definitions 
public interface IRange<T> : IRange 
{ 
} 

Và nhà thiết kế (XAML) ở đây:

<local:DateTimeAxis Style="{StaticResource XAxisStyle}"            
     VisibleRange="{Binding ElementName=priceChart, 
         Path=XAxis.VisibleRange, Mode=TwoWay}"/> 

tôi nhận được ngoại lệ này:

A 'Binding' không thể được đặt trên thuộc tính 'VisibleRange' thuộc loại 'DateTimeAxis'. Chỉ có thể đặt 'Binding' trên DependencyProperty của DependencyObject.

Lớp dẫn xuất DateTimeAxis đang hiển thị thuộc tính VisibleRange bị ghi đè bởi từ khóa new. Tôi không thể thêm typeparam chung vào lớp cơ sở AxisBase và tôi cũng cần truy cập thuộc tính trong cả hai lớp. Vì vậy, tôi tự hỏi đưa ra những hạn chế, nếu có ai có bất cứ đề nghị về cách làm điều này tốt hơn để tránh các trường hợp ngoại lệ thiết kế?

+0

Andrew Burnett-Thom: bạn đã thử viết mã như câu trả lời của tôi chưa. Nó có hoạt động không? – Tigran

Trả lời

10

Các 'tài sản phụ thuộc' là điều bạn đã đăng ký với:

public static readonly DependencyProperty VisibleRangeProperty = 
    DependencyProperty.Register("VisibleRange", typeof(IRange), typeof(AxisBase), ...); 

Và khi bạn nhìn vào tuyên bố rằng bạn có thể thấy rằng nó được đăng ký với typeof(IRange)

Các lớp được thừa kế DateTimeAxis là hiển thị thuộc tính VisibleRange được ghi đè bởi từ khóa mới.

Có, nhưng nó hiển thị thuộc tính 'bình thường' chứ không phải Thuộc tính phụ thuộc.
Một yếu tố khác là các thuộc tính có các loại khác nhau.

+0

Nó đang hiển thị DependencyProperty của cơ sở - tôi cho rằng đây là nơi sai của nó? Tôi có thể có thể ghi đè mới và chỉ cần đặt phôi trên mã –

+2

Có, DP là những con thú lạ. Tôi sẽ phá vỡ điều này. –

+0

Xong, và làm việc :) Cảm ơn bạn đã tip! –

0

Hãy thử để viết trong phần khởi tạo mã của bạn của XAxis của bạn, giống như

AxisBase XAxis = new DateTimeAxis()

nên làm việc.

+0

Tôi tò mò nếu có ... –

+0

@ HenkHolterman: thực sự tôi cũng vậy, sẽ viết thư cho OP .. :) – Tigran

+0

Không chắc chắn ý của bạn là gì - DateTimeAxis được xây dựng trong Xaml, chứ không phải mã C# –

Các vấn đề liên quan