Laden...

DependencyProperty in eigener Klasse implementieren und vererben

Erstellt von IamTheBug vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.291 Views
I
IamTheBug Themenstarter:in
401 Beiträge seit 2006
vor 8 Jahren
DependencyProperty in eigener Klasse implementieren und vererben

Hi,

ich habe eine Frage zu DependencyProperties.
Ich möchte folgendes erreichen:

Ich habe eine Klasse und diese Klasse besitzt eine Liste von Elementen einer anderen Klasse.
An einem Beispiel erklärt:


public class Level 
{}

und


public class Shelf
{
public List<Level> Levels { get; set; }
}

Es ist also so das es eine Schrankklasse gibt und diese hält eine Liste von Ebenen im Schrank.
Jetzt wollte ich an der Schrankklasse ein DependencyProperty erstellen. Das Merkmal soll den "Inhalt" angeben. Also was in dem Schrank liegt. Zum Beispiel Schuhe.
Das soll am Schrank angegeben werden und sich auf die Levelklasse durch Vererbung übertragen. So wie es im XAML ja mit styles usw gemacht wird. D.h. in den Klassen "Level" möchte ich auch darauf einfach so zugreifen können.

Das ganze sind aber Elemente die grafisch natürlich jetzt nicht dargestellt werden wie ein Button.
Geht das überhaupt so?
Ist das so angedacht oder Blödsinn?
Was benötige ich dazu?
Ein DependencyProperty?
Meine Klasse Shelf muss von FrameworkElement ableiten damit das ganze im LogicalTree hängt?
Was passiert, wenn eine Level-klasse mal nicht im Shelf hängt und somit nicht das Merkmal "Inhalt" vererbt bekommt und drauf zugreifen möchte.

Vielen Dank und viele Grüße

Mfg

IamTheBug

16.842 Beiträge seit 2008
vor 8 Jahren

Vererbung ist dazu gedacht, dass verwandte Elemente zusammen hängen.
Ich erkenn jetzt keine Verwandtschaft zwischen einem Brett (Level) und irgendeinem Inhalt Ding, das ich auf dieses Brett legen kann.

Nur weil es WPF ist sollte man die Grundregeln nicht ändern.

Wenn dann hat das Level eine Collection von IThing und das Ding implementiert dann eben dieses IThing, das somit alles mögliche sein kann.
Ein Ding kann zwar auf einem Brett liegen und damit sich im Regal befinden, aber verwandt ist es eben noch lange nicht.

I
IamTheBug Themenstarter:in
401 Beiträge seit 2006
vor 8 Jahren

Eventuell habe ich mich falsch ausgedrückt, natürlich meine ich nicht Vererben im Sinne von Klassen vererben.
Aber im Zusammenhang von WPF spricht man doch von Vererbung oder durchreichen von Eigenschaften unterhalb des LogicTrees.
Sowas wollte ich.

In ein Regal kann ich doch Sachen reinlegen. Zum Beispiel Bücher, Schuhe usw.
Ich wollte einfach an dem Schrank ein Merkmal haben das ich zum Beispiel auf Bücher setze und anschließend haben alle Kindelemente davon zugriff drauf und wissen das sie Bücher lagern. Anschließend soll man das an einer Ebene überschreiben können und sagen können: du lagerst keine Bücher, du lagerst CDs.

So wie es eben auch bei WPF mit DependencyProperty gemacht wird. Diese werden im LogicalTree auch "durch gereicht". Setze ich zum Beispiel den Datacontext einen Usercontrols haben alle Elemente im LogicalTree drunter auch zugriff dadrauf ausser man überschreibt es und weisst ein anderen Datacontext zu.

Ich dachte ich kann DependencyProperties dafür nutzen, anstatt ein Merkmal an das Regal zu heften und anschließend sobald sich dieses ändert das den Ebene immer mitzuteilen.

Mfg

IamTheBug

M
177 Beiträge seit 2009
vor 8 Jahren

In ein Regal kann ich doch Sachen reinlegen. Zum Beispiel Bücher, Schuhe usw.
Ich wollte einfach an dem Schrank ein Merkmal haben das ich zum Beispiel auf Bücher setze und anschließend haben alle Kindelemente davon zugriff drauf und wissen das sie Bücher lagern.

Anschließend soll man das an einer Ebene überschreiben können und sagen können: du lagerst keine Bücher, du lagerst CDs.

DPs haben folgende Eigenschaften bzw. unterstützen z.B.:*DataBinding *Styles *Animations *Default Value (Metadaten) *Callback Funktion der beim Value setzen der DI exekutiert wird *Abgeleitete Klassen können das Verhalten der DI veränrden (Metadaten, Callback Funktion) *Setzen des Wertes über XAML

So wie du es geschrieben hast willst du eine Attached DP. Siehe auch hier

Ich weiß nicht genau, was du vor hast, aber ich hätte das so gestaltet:

RegalControl hat eine DP mit IEnumerable<Fach> Faecher. Für jedes Fach Item im RegalControl zeigst du ein FachControl an.

Das FachControl hat eine DP mit IEnumerable<Items> Items

Dann hast du z.b: eine Klasse Schuh : Item, Buch : Item, DVD : Item

So kannst du z.B. in ein FachControl unterschiedliche Dinge wie z.B. Bücher als auch Schuhe geben, so wie es im realen Leben ist.

Wenn du nur einen bestimmten Item Typ zulassen willst, kannst du auch einfach im FachControl eine weitere DP hinzufügen mit z.B. einem Enum DVD/Buch/Item und beim setzen der Items prüfen ob auch die Items passen und gegebenefalls eine Exception werfen.

PS: Das alles könnte man auch mit einem ItemsControl + DataTemplate welches wiederum ein ItemsControl enthät + bisschen Stylen auch realisieren. Das heißt ein UserControl oder ein CustomControl ist nicht unbedingt notwendig.