Aggiunta di proprietà personalizzate a un diagramma livelli
Quando si scrive il codice delle estensioni per i diagrammi livello in Visual Studio Ultimate, è possibile archiviare i valori a qualsiasi elemento in un diagramma livello.I valori saranno permanenti quando il diagramma viene salvato e riaperto.È inoltre possibile rendere disponibili queste proprietà nella finestra Proprietà in modo da poter visualizzare e modificare gli utenti.Ad esempio, è possibile consentire agli utenti di specificare un'espressione regolare per ogni livello e scrivere il codice di convalida per verificare che i nomi delle classi in ogni livello viene conformassero al modello specificato dall'utente.
Proprietà non visibili all'utente
Se si desidera solo il codice per associare i valori a qualsiasi elemento in un diagramma livello, non è necessario definire un componente MEF.Esiste un dizionario denominato Properties in ILayerElement.Aggiungere semplicemente i valori marshalable al dizionario di qualsiasi elemento del livello.Saranno salvati come parte del diagramma livello.Per ulteriori informazioni, vedere Esplorazione e aggiornamento di modelli di livello nel codice del programma.
Proprietà che l'utente può modificare
Preparazione iniziale
Importante |
---|
Per eseguire le proprietà visualizzate, è necessario effettuare la seguente modifica in ogni computer in cui si desidera visualizzare le proprietà del livello sia visibile.
|
Assicurarsi che il codice sia in un progetto VSIX
Se la proprietà fa parte di un comando, un movimento, o un progetto di convalida, non è necessario aggiungere alcun elemento.Il codice per la proprietà personalizzata deve essere definita in un progetto di estensibilità di Visual Studio definito come componente MEF.Per ulteriori informazioni, vedere Aggiunta di comandi e movimenti a diagrammi livelli o Aggiunta di strumenti di convalida architettura personalizzati a diagrammi livelli.
Definire una proprietà personalizzata
Per creare una proprietà personalizzata, definire la classe come segue:
[Export(typeof(IPropertyExtension))]
public class MyProperty
: PropertyExtension<ILayerElement>
{
// Implement the interface.
}
È possibile definire proprietà su ILayerElement o su una delle relative classi derivate, che includono:
ILayerModel: modello.
ILayer: ogni livello.
ILayerDependencyLink: collegamenti tra livelli.
ILayerComment
ILayerCommentLink
Per visualizzare le proprietà personalizzate
Importante |
---|
Le proprietà personalizzate vengono visualizzati solo se Esplora architettura è aperta prima di caricare il progetto di modello.È necessario l'aprire Esplora architettura e quindi arrestare e riavviare Visual Studio per visualizzare le proprietà personalizzate.Dal menu Architettura, scegliere Windows, Esplora architettura. |
Per testare le proprietà personalizzate, premere F5 per avviare un'istanza sperimentale di Visual Studio.Creare un esempio dell'elemento del livello appropriato e selezionarlo.Verrà visualizzata la proprietà personalizzata nella Finestra Proprietà.
Esempio
Il codice seguente è un tipico esempio di descrittore di proprietà personalizzato.Definisce una proprietà booleana nel modello di livello (ILayerModel) che consente all'utente di fornire valori per un metodo di convalida personalizzato.
using System;
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;
namespace MyNamespace
{
/// <summary>
/// Custom properties are added to the Layer Designer via a custom
/// Property Descriptor. We have to export this Property Descriptor
/// using MEF to make it available in the Layer Designer.
/// </summary>
[Export(typeof(IPropertyExtension))]
public class AllTypesMustBeReferencedProperty
: PropertyExtension<ILayerModel>
{
/// <summary>
/// Each custom property must have a unique name.
/// Usually we use the full name of this class.
/// </summary>
public static readonly string FullName =
typeof(AllTypesMustBeReferencedProperty).FullName;
/// <summary>
/// Construct the property. Notice the use of FullName.
/// </summary>
public AllTypesMustBeReferencedProperty()
: base(FullName)
{ }
/// <summary>
/// The display name is shown in the Properties window.
/// We therefore use a localizable resource.
/// </summary>
public override string DisplayName
{
get { return Strings.AllTypesMustBeReferencedDisplayName; }
}
/// <summary>
/// Description shown at the bottom of the Properties window.
/// We use a resource string for easier localization.
/// </summary>
public override string Description
{
get { return Strings.AllTypesMustBeReferencedDescription; }
}
/// <summary>
/// This is called to set a new value for this property. We must
/// throw an exception if the value is invalid.
/// </summary>
/// <param name="component">The target ILayerElement</param>
/// <param name="value">The new value</param>
public override void SetValue(object component, object value)
{
ValidateValue(value);
base.SetValue(component, value);
}
/// <summary>
/// Helper to validate the value.
/// </summary>
/// <param name="value">The value to validate</param>
private static void ValidateValue(object value)
{ }
public override Type PropertyType
{ get { return typeof(bool); } }
/// <summary>
/// The segment label of the properties window.
/// </summary>
public override string Category
{
get
{
return Strings.AllTypesMustBeReferencedCategory;
}
}
}
}