Chiamare un costruttore parametrizzato da XAML

Durante l’utilizzo di WPF ho notato che quando aggiungo un controllo a un file XAML, viene chiamato il costruttore predefinito.

C’è un modo per chiamare un costruttore parametrizzato?

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

x: Direttiva sugli argomenti

  oneOrMoreObjectElements   

Mi rendo conto che sono in ritardo per la festa qui, ma dal momento che nessuno ha veramente affrontato le convenzioni del WPF, ho pensato di entrare.

Uno dei principi guida degli oggetti compatibili con XAML è 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’object 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.

Potresti, tuttavia, avere alcune considerazioni speciali che sono importanti per la tua implementazione ma in contrasto con le convenzioni:

  1. Potresti avere una o più proprietà che devono essere impostate prima che l’object possa essere utilizzato.
  2. Due o più proprietà possono essere reciprocamente esclusive tra loro, ad esempio, non ha senso impostare sia StreamSource che UriSource di un’immagine.
  3. Si consiglia di assicurarsi che una proprietà sia impostata solo durante l’inizializzazione.
  4. Una proprietà può dipendere da un’altra, che può essere complicata a causa della suddetta convenzione di indipendenza dell’ordine quando si impostano le proprietà.

Per semplificare la gestione di questi casi, viene fornita l’interfaccia ISupportInitialize . Quando un object viene letto e creato da XAML (cioè analizzato), gli oggetti che implementano ISupportInitialize verranno gestiti in modo speciale:

  1. Il costruttore predefinito verrà chiamato.
  2. BeginInit() verrà chiamato.
  3. Le proprietà verranno impostate nell’ordine in cui sono state visualizzate nella dichiarazione XAML.
  4. EndInit() è chiamato.

Tracciando le chiamate a BeginInit() e EndInit() , è ansible gestire tutte le regole che è necessario imporre, incluso il requisito che determinate proprietà siano impostate. Questo è il modo in cui dovresti gestire i parametri di creazione; non richiedendo argomenti del costruttore.

Notare che ISupportInitializeNotification è anche fornito, che estende l’interfaccia precedente aggiungendo una proprietà IsInitialized e l’evento Initialized . Raccomando di usare la versione estesa.

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

Sì, puoi farlo da ObjectDataProvider . Ti consente di chiamare il costruttore non predefinito, ad esempio:

     Joe      

supponendo che la Persona sia

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

Sfortunatamente non è ansible associare i parametri ConstructorParameters . Vedi qualche soluzione qui .