通用UserControls和通用依赖属性是否可行?

时间:2012-09-01 09:46:35

标签: wpf generics dependency-properties initializecomponent

我有一个抽象泛型类,它定义了一个泛型依赖属性,其类型由子类化定义。此属性以某种方式不被识别为依赖项属性,因此在绑定到此属性时,我在运行时收到错误消息。此外,在编译期间,构造函数无法调用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" /> 

P.S。我也不太确定partial内容是否正确完成 - R#建议删除这些关键字。

2 个答案:

答案 0 :(得分:1)

我认为您的代码存在一些问题,但首先,让我在此上下文中解释partial

partial用于在单独的文件中声明一个类。当visual studio从你的MySubClass.g.cs创建partial class MySubClass InitializeComponent(btw。这是声明方法MySubClass.xaml的地方)时,你会有两次这样的类声明,因此要编译它,您将需要partial关键字。

现在剩下的就是:XAML和泛型不能很好地结合在一起,这意味着:根本不是。您的“相应XAML”声明为MyClass。但是不存在没有通用参数的MyClass。您可以在此时将x:Class="Path.of.Namespace.MyClass"更改为x:Class="Path.of.Namespace.MySubClass",这应该可以。

但现在接下来就是:你想如何在xaml中访问该dependecy属性?它是泛型类型中的静态成员,因此您必须在代码中指定它:MyClass<ClassWithAList, List<int>>.DPProperty。问题是:你不能在xaml中做到这一点

要解决您的问题,告诉我们您想要实现的目标可能是个好主意

答案 1 :(得分:0)

我认为问题可能是您正在编写typeof(MyClass),应该是typeof(MyClass<T,U>)