2

サブクラス化クラスによって型が定義されるジェネリック依存プロパティを定義する抽象ジェネリック クラスがあります。このプロパティはどういうわけか依存関係プロパティとして認識されないため、実行時にこのプロパティにバインドするとエラー メッセージが表示されます。さらに、コンパイル時にコンストラクターを呼び出すことはできませんInitializeComponent。何故ですか?

汎用抽象クラスMyClass:

abstract public class MyClass<T,U> : UserControl {
    protected MyClass() {
        InitializeComponent(); // Here is one error: Cannot be found
    }

    abstract protected U ListSource;

    private static void DPChanged
    (DependencyObject d, DependencyPropertyChangedEventArgs e) {
        var myClassObj = (MyClass) d;
        myClassObj.DataContext = myClassObj.ListSource;
    }

    // Causes a binding error at runtime => DP (of the concrete subclass)
    // is not recognized as a dependency property 
    public static readonly DependencyProperty DPProperty = 
        DependencyProperty.Register(
        "DP", 
        typeof(T), 
        typeof(MyClass), 
        new PropertyMetadata(null, DPChanged));

    public T DP {
        get { return (T) GetValue(DPProperty); }
        set { SetValue(DPProperty, value); }
    }
}

対応する XAML:

<UserControl x:Class="Path.of.Namespace.MyClass"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ListView>
        <!-- Some stuff for the list view - used for all subclasses -->
    </ListView>
</UserControl>

具体的なサブクラスMySubClass:

public partial class MySubClass : MyClass<ClassWithAList, List<int>> {
    public MySubClass() {
        InitializeComponent(); // Another error: Cannot be found
    }

    protected List<int> ListSource {
        get { return new List<int>(); } // Just a dummy value

    }
}

対応する XAML:

<local:MySubClass xmlns:local="Path.of.Namespace.MySubClass" /> 

PS私はまた、partial物事が正しく行われたかどうかもよくわかりません.R#はこれらのキーワードを削除することを提案しています.

4

2 に答える 2

1

あなたのコードにはいくつか問題があると思いますが、まず、partialこのコンテキストで説明させてください。

partial別々のファイルで 1 つのクラスを宣言するために使用されます。Visual Studio が(ところで、ここでメソッドが宣言されている) を作成しMySubClass.g.csているので、このクラス宣言を 2 回行うため、これをコンパイルするにはキーワードが必要になります。partial class MySubClassInitializeComponentMySubClass.xamlpartial

残りの部分: XAML とジェネリックは一緒にうまく機能しません。つまり、まったくそうではありませ。あなたの「対応するXAML」はMyClass. しかし、MyClassジェネリック パラメータのない a は存在しません。この時点で に変更できますx:Class="Path.of.Namespace.MyClass"。これx:Class="Path.of.Namespace.MySubClass"でうまくいくはずです。

しかし、次は、xaml でその依存関係プロパティにどのようにアクセスしたいですか? これはジェネリック型の静的メンバーであるため、コードで次のように指定する必要がありますMyClass<ClassWithAList, List<int>>.DPProperty。ここでも問題があります。xaml ではそれを行うことはできません。

あなたの問題を解決するために、あなたが達成したいことを私たちに伝えるのは良い考えかもしれません

于 2012-09-15T00:02:01.040 に答える
0

問題は、あなたが typeof(MyClass) を書いていることであり、そうあるべきだと思いますtypeof(MyClass<T,U>)

于 2012-09-13T17:40:05.640 に答える