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用于在单独的文件中声明一个类。由于 Visual Studio 正在从您创建一个MySubClass.g.cspartial class MySubClass顺便说一句,这是声明该方法InitializeComponent的位置),MySubClass.xaml因此您将有两次此类声明,因此要编译它,您将需要partial关键字。

现在剩下的: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 回答