6

次のようなクラス階層があり、VisibleRange プロパティへのバインドがデザイナーでスローされます。

ここにクラス階層があるとします。

// 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 
{
}

デザイナー (XAML) は次のとおりです。

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

私はこの例外を受け取ります:

タイプ 'DateTimeAxis' の 'VisibleRange' プロパティに 'Binding' を設定することはできません。「Binding」は、DependencyObject の DependencyProperty でのみ設定できます。

派生クラスは、キーワードDateTimeAxisによってオーバーライドされる VisibleRange プロパティを公開しています。new基本クラスにジェネリック typeparam を追加することはできませんAxisBase。また、両方のクラスでプロパティにアクセスする必要があります。したがって、これらの制約を考えると、デザイナーの例外を回避するためにこれをより適切に行う方法について誰か提案があるかどうか疑問に思っていますか?

4

2 に答える 2

10

「依存関係プロパティ」は、登録したものです。

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

そして、そのステートメントを見ると、それが登録されていることがわかりますtypeof(IRange)

派生クラス DateTimeAxis は、新しいキーワードによってオーバーライドされる VisibleRange プロパティを公開しています。

はい。ただし、依存関係プロパティではなく、「通常の」プロパティを公開しています。
もう 1 つの要因は、プロパティの型が異なることです。

于 2012-04-05T21:36:30.823 に答える
0

XAxisのように、コードの初期化に書き込んでみてください

AxisBase XAxis = new DateTimeAxis ()

動作するはずです。

于 2012-04-05T21:36:52.387 に答える