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?
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?
No. Non da XAML [quando si utilizza WPF].
.NET 4.0 offre una nuova funzionalità che sfida la risposta.
<object ...>
<x:Arguments>
oneOrMoreObjectElements
</x:Arguments>
</object>
Bello, sono contento che tu ha portato questo. –
Un altro post su http://www.wpftutorial.net/XAML2009.html –
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
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:
StreamSource
sia UriSource
di un'immagine.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:
BeginInit()
verrà chiamato.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.
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.
si prega di dare un'occhiata alla mia domanda http://stackoverflow.com/questions/15735830/wpf-best-practice-of-registering-a-delegatecommand-to-a-compositecommand –