2016-06-21 10 views
-1

Ich benutze ein Enum, um meine ListView mit Elementen zu füllen.WPF UserControl Navigieren mit Enum-Tags

Nach dem Füllen möchte ich die spezifische Benutzersteuerung nach einem onclick, mit dem Enum-Tag oder etwas anderes erhalten.

Ich verwende die Description, um den Artikelnamen anzugeben. Aber Ich möchte auch für jedes Enum sein UserControl binden.

Ich möchte es tun (Pseudo-Code):

onClick(object sender, Args....){ 
ItemXY foo = sender as ItemXY 
this.UserControl = foo.getUserControl(); 
... 
} 

meine Enum:

public enum UserControlsEnum 
{ 
    [Description("Cash")] 
    Cash  = 0, 
    [Description("History")] 
    Velocity = 1, 
    [Description("Statistik")] 
    Statistik = 2, 
    [Description("Information")] 
    Info  = 3, 
    [Description("Administration")] 
    Admin  = 4, 
    [Description("About")] 
    About  = 5 
} 

Meine Frage ist:

Gibt es einen Tag wie Beschreibung Setzen Sie den Namen der spezifischen Ansicht als String oder besser direkt auf die spezifische Ansicht?

wie:

[Description("Cash")] 
-->[Tag("ItemView.xaml")] 
    Cash  = 0, 
+1

Sie benutzerdefinierte Attribute hinzufügen können, sicher, aber sie sind keine Zauberei. Sie müssen auch etwas bauen, das nach diesem Attribut sucht und etwas damit macht. Es gibt kein integriertes Attribut zum Zuordnen von Aufzählungswerten zu Sichten. –

+4

Wie würde der Absender eines Click-Ereignisses jemals eine Enumeration sein? – Clemens

+0

Zeigt 'ListView' Enum-Mitglieder an (ich meine, jede Zeile ist eine visuelle Repräsentation des Enum-Mitglieds)? Was willst du letztendlich tun? – Dennis

Antwort

4

Dies sollte funktionieren:

public sealed class ViewTagAttribute : Attribute 
{ 
    /// <summary> 
    /// Constructor 
    /// </summary> 
    /// <param name="viewType"></param> 
    public ViewTagAttribute(System.Type viewType) 
    { 
     this.type = viewType; 
    } 

    /// <summary> 
    /// Create an instance of the associated view 
    /// </summary> 
    /// <returns></returns> 
    public static View CreateViewInstanceForEnumValue<T>(T enumValue) 
    { 
     var attributes = typeof(T).GetField(enumValue.ToString()).GetCustomAttributes(true); 
     var viewAttr = (from a in attributes where a is ViewTagAttribute select (ViewTagAttribute)a).FirstOrDefault(); 

     if (viewAttr != null) 
      return System.Activator.CreateInstance(viewAttr.type) as View; 

     return null; 
    } 

    /// <summary> 
    /// Associated view type 
    /// </summary> 
    private readonly System.Type type; 
} 

Sie können dann die Steuerung für jeden Aufzählungsmember setzen Sie das Attribut ViewTag, z.B. :

public enum UserControlsEnum 
{ 
    [Description("Cash")] 
    [ViewTag(typeof(View1))] 
    Cash = 0, 

    [Description("History")] 
    [ViewTag(typeof(View2))] 
    Velocity = 1, 

    [Description("Statistik")] 
    [ViewTag(typeof(View3))] 
    Statistik = 2, 

    [Description("Information")] 
    [ViewTag(typeof(View1))] 
    Info = 3, 

    [Description("Administration")] 
    [ViewTag(typeof(View1))] 
    Admin = 4, 

    [Description("About")] 
    [ViewTag(typeof(View1))] 
    About = 5 
} 

Dann können Sie die Ansicht mit so etwas wie erstellen:

this.UserControl = (UserControl)ViewTagAttribute.CreateViewInstanceForEnumValue(foo); 
+0

Ich erhalte einen Fehler auf System.Activator.CreateInstance (viewAttr.type) als Ansicht; Diese Ansicht ist nicht nullbar – SeeuD1

+0

Ersetzen Sie die Ansicht mit UserControl –

+0

Arbeitete alles gut danke – SeeuD1