Übergeben/(Referenzieren) von XAML-Objekten in XAML

Marschal

Großer Enumerator
Hallo nach langem wieder mal!

Da ich bei meinem Problem einfach nciht fündig werde, stelle ich mein Problem mal hier im Forum vor.
Vornweg, es handelt sich hier zwar hauptsächlich um ein Xaml/Xml Problem, dennoch hat dieser Ansatz mehr mit XAML selber (weniger mit WPF), und somit mit .Net zu tun, weshalb ich das Problem in .Net und Wpf gepostet.

Kurz zum Hintergrund:
Ich arbeite an einem WPF Projekt und nutze c#, .Net4.0 und das MVVM Pattern.
Ich habe eine Konfiguration meiner Anwendung komplett mittels XAML-Markup realisiert (hat den Hintergrund, dass beim parsen direkt ein Objekt-Baum erzeugt wird).

Zum Problem (Kurzfassung):
Ich suche nach einem Weg wie ich in XAM Objekte/Elemente referenzieren kann.

Problem (Detailiert):
Hier ist ein kleines Code-beispiel:

XML:
<RootConfiguration
  xmlns="clr-namespace:Configuration;assembly=Configuration"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <RootConfiguration.Elements>
    <ElementList x:Name="completeElementDefinition">
      <Element Type="X" Show="True" Refresh="30" Name="A1" />
      <Element Type="Y" Show="True" Refresh="30" Name="B1" />
    </ElementList>
  </RootConfiguration.Elements>

  <RootConfiguration.ElementGroups>
    <ElementGroupList>
      <ElementGroup Name="All Elements">
        <ElementGroup.Elements>
          <!-- How to reference the ElementList "completeElementDefinition" defined above -->
        </ElementGroup.Elements>
      </ElementGroup>
      <ElementGroup Name="Type X Elements">
        <ElementGroup.Elements>
          <ElementList>
            <!-- How to reference single Elements from the list "completeElementDefinition" -->
          </ElementList>
        </ElementGroup.Elements>
      </ElementGroup>
      <ElementGroup Name="Type Y Elements">
        <ElementGroup.Elements>
          <ElementList>
            <!-- How to reference single Elements from the list "completeElementDefinition" -->
          </ElementList>
        </ElementGroup.Elements>
      </ElementGroup>
    </ElementGroupList>
  </RootConfiguration.ElementGroups>

</RootConfiguration>

Im Hintergrund habe ich Klassen die diese Struktur repräsentieren (und später die Objekt-Struktur aufbauen). Mein Problem ist, ich möchte vermeiden die Elemente, die in dem Attribut 'Elements' deklariert sind redundant im Element 'ElementGroup' nochmal zu deklarieren, deswegen suche ich nach einer Möglichkeit wie ich die Elemente aus 'Elements' referenzieren, bzw "übergeben" kann, und in 'ElementList' verwenden kann (siehe Quelltext).

Ich habe bereits einige Ansätze gefunden, jedoch führten diese noch nciht zum Ziel. Stichwort: x:Reference oder DependencyProperty.

Bin für jegliche Anregung und Diskussion dankbar.

MfG marschal




EDIT: GELÖST

Nach nun langer suche bin ich selber auf die Lösung gestoßen, den ich sah den Wald vor Bäumen nicht mehr.
Deswegen möchte ich meine Lösungen auch hier teilen, falls jemand das selbe oder ähnliche Problem haben sollte...

Die Lösung bestand darin die zwei oben genannten Aspekte (DependencyProperty und x:Reference) zu kombinieren.

Ich habe nun eine DependencyProperty für die Eigenschaft ElementGroup.Elements implementiert:
C++:
#region Dependancy Property
// Dependency Property
public static readonly DependencyProperty ElementsProperty =
     DependencyProperty.Register("Elements", typeof(ElementList),
     typeof(ElementGroup), new PropertyMetadata(null));

// .NET Property wrapper
public ElementList Elements {
  get { return (ElementList )GetValue(ElementsProperty ); }
  set { SetValue(ElementsProperty , value); }
}
#endregion

Nun lassen sich in dem XAML-Dokument die in RootConfiguration.Elements definierten Elemente, bzw. ElementList-Objekte referenzieren mittels eines Data-Bindings:
XML:
<RootConfiguration.ElementGroups>
    <ElementGroupList>
        <ElementsGroup Name="All Elements" Elements="{x:Reference completeElementDefinition}" />
    <!-- [...] -->
    </ElementGroupList>   
</RootConfiguration.ElementGroups>


MfG
 
Zuletzt bearbeitet von einem Moderator:
Zurück