Mam abstrakcyjną klasę generyczną, która definiujeogólna własność zależności, której typ ma być określony przez klasy podklas. Ta właściwość nie jest w jakiś sposób rozpoznawana jako właściwość zależności, tak że pojawia się komunikat o błędzie podczas wykonywania w trakcie wiązania z tą właściwością. Dodatkowo podczas kompilacji konstruktor nie może wywołać InitializeComponent
. Dlaczego?
Ogólna klasa abstrakcyjna 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); }
}
}
Odpowiedni 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>
Konkretna podklasa 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
}
}
Odpowiedni XAML:
<local:MySubClass xmlns:local="Path.of.Namespace.MySubClass" />
P.S. Nie jestem też całkiem pewien, czy partial
rzeczy są zrobione poprawnie - R # sugeruje usunięcie tych słów kluczowych.
Odpowiedzi:
1 dla odpowiedzi № 1Sądzę, że z kodem jest kilka rzeczy, ale najpierw pozwól mi wyjaśnić partial
w tym kontekście:
partial
służy do deklarowania jednej klasy w osobnych plikach. Jak studio wizualne tworzy MySubClass.g.cs
z a partial class MySubClass
(Przy okazji, tutaj jest metoda InitializeComponent
jest zadeklarowany) z twojego MySubClass.xaml
będziesz miał dwie deklaracje klasowe, a tym samym, aby to skompilować, będziesz potrzebował partial
słowo kluczowe.
A teraz reszta: XAML i generics nie radzą sobie dobrze, co oznacza: Ani trochę. twój "odpowiedni XAML" deklaruje a MyClass
. Ale a MyClass
bez parametrów ogólnych nie istnieje. Możesz w tym momencie zmienić x:Class="Path.of.Namespace.MyClass"
do x:Class="Path.of.Namespace.MySubClass"
, to powinno działać.
ale teraz następną rzeczą jest: w jaki sposób chcesz uzyskać dostęp do tej właściwości dependecy w Xaml? jest to statyczny element w typie ogólnym, więc trzeba to określić w kodzie: MyClass<ClassWithAList, List<int>>.DPProperty
. Problem jest znowu: nie możesz tego zrobić w xaml
aby rozwiązać Twój problem, dobrym pomysłem może być poinformowanie nas o tym, co chcesz osiągnąć
0 dla odpowiedzi nr 2
Myślę, że problem może polegać na tym, że piszesz typeof (MyClass) i tak powinno być typeof(MyClass<T,U>)
.