/ / Czy możliwe są ogólne UserControls i ogólne właściwości Dependency? - wpf, generics, dependency-properties, initializecomponent

Czy możliwe są ogólne funkcje UserControls i ogólne właściwości Dependency? - wpf, generics, dependency-properties, initializecomponent

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 № 1

Są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>).