PropertyModel

Die Deklaration der Elemente für die Nutzung des PropertyModel erfolgt per Attribut an den Eigenschaften einer Klasse.

Bei den Attributen können auch Layout-Aspekte angegeben werden (Tab-Namen, Gruppen-Namen, Sortierungen etc.). Technisch wird dies realisiert, indem an allen Eigenschaften die Werte wiederholt werden (müssen).

Vor allem beim nachträglichen Ändern ist das recht mühsam und fehleranfällig. Mit der Version 4.0.11 wurde eine XML-Beschreibung dazu eingeführt.

Das XSD-Schema steht hier zum Download bereit.

Vorgehen mit XML-Datei

Aus technischer Sicht:

Wenn der PropertyModel-Serializer die Eigenschaften als Client-Objekt erstellt, wird optional an der Property-Klasse eine ggf. vorhandene statische Methode LAYOUT(String) gesucht, die eine Instanz eines IduIT.Core.PropertyModel.Auto.LayoutType zurückgibt.

Das im Folgenden dargestellt Vorgehen ist nur eine Möglichkeit (Best practice).

Mit dem hier skizzierten Standard-Mechanismus ist ein recht einfaches Handling möglich und es ergeben sich ein paar Vorteile:

  • Alle Layout-Parameter übersichtlich in einer Datei
  • Die Tabs, Gruppen und Felder stellen sich automatisch in der Reihenfolge dar, in der man sie schreibt
  • Namen für Tabs und Gruppen müssen nur 1 Mal geschrieben werden

Die Ablage im Dateisystem stellt sich dann wie folgt dar:

  1. Ein Layout pro Klasse (Bedenke hier: Dateiname == Klassenname)
+ NamespaceA
  - ClassA.cs
  - ClassA.pm.layout.xml
  - ClassB.cs
  - ClassB.pm.layout.xml

oder ...

  1. Eine Layoutdatei für mehrere Klassen (dort gibt es dann am Layout den Typnamen als Attribut).
+ NamespaceA
  - ClassA.cs
  - ClassA.pm.layout.xml 
  - ClassB.cs
  - pm.layout.xml

Im Debug werden die Daten als Datei gelesen, im Release-Build gecached und als eingebettete Ressource aus dem Assembly geladen.

Schritt-für-Schritt:

  1. Erweitern der Datei AssemblySourceInfo.cs um die Methode GetPropertyModelLayout
public static IduIT.Core.PropertyModel.Auto.LayoutType GetPropertyModelLayout(string typeName)
{
  #if DEBUG
    var result = Core.PropertyModel.PMXmlLayoutLoader.TryGetLayoutFromSourceFile(DefaultNamespace, SourceCodeBaseFolder, typeName);
  #else
    var result = Core.PropertyModel.PMXmlLayoutLoader.TryLoadGetLayoutFromResource(typeof(AssemblySourceInfo).Assembly, typeName);
  #endif
  if (null == result)
    throw new Exception($"Es ist keine Resource/Datei mit der Erweiterung \"pm.layout\" für den Typ {typeName}, bzw. in dem Namespace vorhanden.");

  return result;
}
  1. Erweitern der Klasse mit dem Property-Modell um die statische Methode LAYOUT(string):
namespace NamespaceA
{
  public sealed class ClassA
  {
    static IduIT.Core.PropertyModel.Auto.LayoutType LAYOUT(string typeName) => AssemblySourceInfo.GetPropertyModelLayout(typeName);

    //Hier sind die Properties ....
    [IduIT.Core.PropertyModel.PropertyModelProperty]
    public String Name
    {
      get;set;
    }

    [IduIT.Core.PropertyModel.PropertyModelProperty]
    public String LastName
    {
      get;set;
    }
    //... viele weitere
  }
}
  1. Erstellen der Layout-Datei, Speichern als ClassA.pm.layout.xml (wobei ClassA hier den Typnamen meint, aber bei "uns" gilt die Konvention Dateiname = typename, Ordner = namespace), diese als "Embedded Resource" dem Projekt hinzufügen.
<Layout xmlns="http://www.cardogis.com/cardo4/PropertyModel">
  <Default>
    <Align>Top</Align>
   </Default>
  <Tabs>
    <Tab>
      <Group title="Kontakt">
        <Field name="Name" title="Vorname" />
        <Field name="LastName" title="Nachname" />
      </Group>
    </Tab>
  </Tabs>
</Layout>
  1. Fertig

Im Debug-Build kann einfach die XML-Datei geändert werden, die Änderungen werden sofort nach Neuladen der Seite sichtbar.


Zuletzt geändert: 21.03.2024 09:46:22 (erstmals erstellt 19.03.2019)