2009-07-04 13 views
50

Durante l'utilizzo di WPF ho notato che quando aggiungo un controllo a un file XAML, viene chiamato il costruttore predefinito.Chiamare un costruttore con parametri da XAML

C'è un modo per chiamare un costruttore parametrizzato?

+0

si prega di dare un'occhiata alla mia domanda http://stackoverflow.com/questions/15735830/wpf-best-practice-of-registering-a-delegatecommand-to-a-compositecommand –

risposta

11

No. Non da XAML [quando si utilizza WPF].

66

.NET 4.0 offre una nuova funzionalità che sfida la risposta.

x:Arguments Directive

<object ...> 
    <x:Arguments> 
     oneOrMoreObjectElements 
    </x:Arguments> 
</object> 
+0

Bello, sono contento che tu ha portato questo. –

+1

Un altro post su http://www.wpftutorial.net/XAML2009.html –

+23

Per tutti gli altri che sono venuti qui cercando esattamente questa risposta, ti risparmio un po 'di tempo perché stai per trovare questo post successivo: http: //stackoverflow.com/questions/14347181/how-to-fix-xaml2009-language-construct-is-not-allowed-here – Kevek

21

mi accorgo di essere in ritardo alla festa qui, ma dal momento che nessuno realmente indirizzata convenzioni WPF, ho pensato di carillon.

Uno dei principi guida della Gli oggetti compatibili con XAML sono che dovrebbero essere completamente utilizzabili con un costruttore predefinito, ovvero non esiste un comportamento accessibile solo quando si utilizza un costruttore non predefinito. Per adattarsi alla natura dichiarativa di XAML, i parametri dell'oggetto sono specificati tramite i setter di proprietà. C'è anche una convenzione che dice che l'ordine in cui le proprietà sono impostate in XAML non dovrebbe essere importante.

Si può, tuttavia, hanno alcune considerazioni particolari che sono importanti per l'implementazione, ma in contrasto con convenzione:

  1. Si può avere una o più proprietà che deve essere impostati prima che l'oggetto può essere utilizzato .
  2. Due o più proprietà possono escludersi a vicenda l'una con l'altra, ad esempio, non ha senso impostare sia StreamSource sia UriSource di un'immagine.
  3. Si consiglia di assicurarsi che una proprietà sia solo impostata durante l'inizializzazione.
  4. Una proprietà può dipendere da un'altra proprietà, che può essere complicata a causa della convenzione sopra menzionata di indipendenza dell'ordine quando si impostano le proprietà.

Per semplificare la gestione di questi casi, viene fornita l'interfaccia ISupportInitialize. Quando un oggetto viene letto e creato da XAML (cioè analizzato), oggetti aventi ISupportInitialize verranno trattati in maniera particolare:

  1. Il costruttore di default sarà chiamato.
  2. BeginInit() verrà chiamato.
  3. Le proprietà verranno impostate nell'ordine in cui sono state visualizzate nella dichiarazione XAML.
  4. EndInit() viene chiamato.

da chiamate di tracking per BeginInit() e EndInit(), è possibile gestire tutto ciò che le regole è necessario imporre, compreso il requisito che certe proprietà essere impostate. Questo è il modo in cui dovresti gestire i parametri di creazione; non richiedendo argomenti del costruttore.

Si noti inoltre che è disponibile ISupportInitializeNotification, che estende l'interfaccia precedente aggiungendo una proprietà IsInitialized e l'evento Initialized. Raccomando di usare la versione estesa.

0

Sì, lo si può fare dallo ObjectDataProvider. Esso consente di chiamare il costruttore non predefinito, ad esempio:

<Grid> 
    <Grid.Resources> 
     <ObjectDataProvider x:Key="myDataSource" 
          ObjectType="{x:Type local:Person}"> 
      <ObjectDataProvider.ConstructorParameters> 
       <system:String>Joe</system:String> 
      </ObjectDataProvider.ConstructorParameters> 
     </ObjectDataProvider> 
    </Grid.Resources> 
    <Label Content="{Binding Source={StaticResource myDataSource}, Path=Name}"></Label> 
</Grid> 

supponendo che la persona è

public class Person 
{ 
    public Person(string Name) 
    { 
     this.Name = Name; 
    } 
    public string Name { get; set; } 
} 

Purtroppo si può associare il ConstructorParameters. Vedere alcuni soluzione alternativa here.

Problemi correlati