Ihre Navigierbare Geschäftsobjekte sollten nach dem Master-Detail-Pattern dargestellt werden wie im folgenden Beispiel:
Diese Kombination aus aufklappbarem Fenster und dem Detailbereich wird mit dem Steuerelement VBDockingManager realisiert. Der Dockingmanager zeigt im Grunde genommen zwei Designs an:
Master (Explorer):
<vb:VBDataGrid VBContent="SelectedMaterial" DisabledModes="Disabled">
<DataGrid.Columns>
<vb:VBDataGridTextColumn VBContent="MaterialNo" />
<vb:VBDataGridTextColumn VBContent="MaterialName1" />
</DataGrid.Columns>
</vb:VBDataGrid>
Die in VBContent angegebene Eigenschaft SelectedMaterial muss in Ihrem Geschäftsobjekt definiert werden:
[ACPropertySelected(302, Material.ClassName, "en{'Material'}de{'Material'}")]
public Material SelectedMaterial
{
get
{
if (AccessPrimary == null)
return null;
return AccessPrimary.Selected;
}
set
{
if (AccessPrimary == null)
return;
AccessPrimary.Selected = value;
OnPropertyChanged("SelectedMaterial");
}
}
Das VBDataGrid, das IVBSource implementiert, kann die dazu passende Datensammlung public IList<Material> MaterialList
automatisch binden, weil beide mit demselben Gruppennamen Material.ClassName
in der ACPropertySelected und ACPropertyList gekennzeichnet worden sind.
Die Selected-Eigenschaft arbeitet intern mit der Selected-Eigenschaft der ACAccessNav<T>-Klasse. Dies ist notwendig, damit über die Navigationstasten im Menüband von der aktuellen Position aus weiter navigiert werden kann (siehe nächsten Abschnitt).
Detail:
<vb:VBGrid>
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="600"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<vb:VBTextBox Grid.Column="0" Grid.Row="0" VBContent="CurrentMaterial\MaterialNo" />
<vb:VBTextBox Grid.Column="0" Grid.Row="1" VBContent="CurrentMaterial\MaterialName1" />
</vb:VBGrid>
Im VBContent wurde eine Eigenschaft mit dem Namen CurrentMaterial adressiert.
Nun werden Sie sich fragen: "Warum nicht die SelectedMaterial?".
Die Antwort ist: Ja Sie können natürlich die SelectedMaterial verwenden. Die Current-Eigenschaft, die übrigens mit der Attributklasse ACPropertyCurrent versehen wird, ist eine optionale Möglichkeit die selektierte Zeile in einem ItemsControl (z.B. Datagrid) zu trennen von dem angezeigten Objekt im Detailbereich. Beispielsweise, wenn man weiter navigieren möchte, ohne den Detailbereich zu ändern. Dies ist ein spezieller Sonderfall, aber in diesem Beispiel soll das der Vollständigkeit halber erwähnt werden.
Damit jedoch beide die Selected-Eigenschaft und Current-Eigenschaft synchron gehalten werden, verwenden sie die "AccessPrimary.Current"-Eigenschaft:
[ACPropertyCurrent(301, Material.ClassName, "en{'Material'}de{'Material'}")]
public Material CurrentMaterial
{
get
{
if (AccessPrimary == null)
return null;
return AccessPrimary.Current;
}
set
{
if (AccessPrimary == null)
return;
AccessPrimary.Current= value;
OnPropertyChanged("CurrentMaterial");
}
}
Master-Detail in untergeordneten Ebenen
Bei Hierarchischen Datenstrukturen sollten sie das Master-Detail-Prinzip weiterführen. Wir empfehlen den Dockingmechanismus auch hier zu verwenden. Dabei sollte die Liste immer links sein und auf der rechten Hälfte der Detailbereich.
Das folgende Beispiel zeigt einen Produktionsauftrag aus "iPlus MES". Hier ist eine dreistufige Datenhierarchie abgebildet, bei der das Master-Detail-Pattern rekursiv angewendet ist:
Schauen Sie sich das Geschäftsobjekt BSOInOrder.cs aus dem Beispielprojekt an. Dort ist eine zweistufige Hierarchie implementiert.