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