Utilizzo degli attributi sulle proprietà per descrivere l'oggetto principale

1

Ho una classe che viene utilizzata per creare una GUI "impostazioni" per qualsiasi altra classe.

Esempio rapido per chiarezza:

Usogliattributiperdecorareisingolielementi.Adesempio,puoispecificareToolTipText:

[Attributes.Display(ToolTipText="IP Address of target computer")]
public string IPAddress;

Ora, la domanda vera: Vorrei aggiungere funzionalità al display per creare una casella di gruppo attorno a diversi elementi. Il mio problema è che non c'è un campo "GroupBox" o un membro già lì da decorare.

Ho avuto alcune idee su come affrontarlo:

  1. Forza la classe a contenere un private GroupBox che può essere decorato. i campi sarebbero decorati per assegnarsi a GroupBox . Mi piace che ci sia qualcosa reale da decorare. Non mi piace che in realtà non ci appartenga. Un altro problema: se volessi creare ancora un altro GroupBox come figlio di questo, sarebbe difficile ordinare gli articoli all'interno del primo GroupBox (attualmente l'ordine è controllato dall'ordine del codice di classe stesso)

    A. Come (1), ma la modifica della GroupBox potrebbe essere eseguita nel costruttore della classe delle impostazioni.

    B. Uguale a (1), ma la classe delle impostazioni potrebbe sottoscrivere un evento "Disegna" e personalizzare l'ordine dei controlli lì.

  2. Ignora che non c'è un oggetto "fisico" da decorare e aggiungi un attributo chiamato GroupBoxName che i campi potrebbero avere. Qualsiasi campo contenente lo stesso GroupBoxName verrebbe raggruppato insieme. GroupBoxName potrebbe contenere un "percorso" per creare "sub GroupBoxes " (ad esempio "ParentBox/ChildBox" ). Il problema con questo approccio è come modifico la scatola stessa? Cosa succede se voglio che la casella abbia BackColor = Color.Green ? Potrei iscrivermi a un evento con la classe delle impostazioni e specificare lì.

Quindi, in sostanza sto cercando idee su come affrontarlo. Mi piacerebbe che il lavoro della classe delle impostazioni fosse il più intuitivo possibile pur consentendo una certa flessibilità. Mi piacerebbe anche progettarlo in modo tale che non abbia la sensazione di "odore di codice".

    
posta MikeH 15.06.2017 - 19:09
fonte

2 risposte

1

L'odore del codice che sto rilevando qui è che i dettagli della vista come ToolTipText vengono applicati insieme a dettagli del modello come IPAddress. L'etichetta IPAddress non dovrebbe essere più vicina al suggerimento rispetto al valore IPAddress? Non sarebbe bello se, diciamo che avessi bisogno di fare una versione francese, se ogni stringa che ha bisogno di essere tradotta si trovasse tutti allo stesso livello architettonico?

Sono molto prudente quando si tratta di decoratori. Ti danno abbastanza potere per cambiare efficacemente il linguaggio con cui lavori con il tuo strano linguaggio personalizzato. Questo può funzionare ma ha delle conseguenze.

    
risposta data 15.06.2017 - 21:56
fonte
0

Potresti definire una struttura separata per gli articoli raggruppati.

Ad esempio. invece di

class User {
    string Name;
    string Phone;
    string Street;
    string City;
    string State;
}

Potresti fare questo:

class Address {
    string Street;
    string City;
    string State;
}


class User {
    string Name;
    string Phone;
    Address Address;
}

E poi decorare su entrambi i livelli:

class Address {
    [Attributes.Display(ToolTipText="Mailing street address")]
    string Street;

    [Attributes.Display(ToolTipText="Mailing city")]
    string City;

    [Attributes.Display(ToolTipText="State code")]
    string State;
}

class User {
    [Attributes.Display(ToolTipText="The legal name of the user")]
    string Name { get; set; }

    [Attributes.Display(ToolTipText="Primary phone number")]
    string Phone { get; set};

    [Attributes.Display(Style="Grouped", BackColor="Green")]
    Address Address { get; private set; }
}
    
risposta data 15.06.2017 - 22:47
fonte

Leggi altre domande sui tag