Come si imposta un codice personalizzato MarkupExtension
?Imposta markupExtension personalizzato dal codice
È possibile impostare facilmente se da Xaml. Lo stesso vale per Binding
e DynamicResource
.
<TextBox FontSize="{Binding MyFontSize}"
Style="{DynamicResource MyStyle}"
Text="{markup:CustomMarkup}"/>
Impostazione gli stessi valori attraverso il codice richiede dietro un po 'diverso approccio
Binding: Usa textBox.SetBinding o BindingOperations.SetBinding
Binding binding = new Binding("MyFontSize"); BindingOperations.SetBinding(textBox, TextBox.FontSizeProperty, binding);
DynamicResource: Utilizzare SetResourceReference
textBox.SetResourceReference(TextBox.StyleProperty, "MyStyle");
CustomMarkup: Come faccio a impostare una consuetudine
MarkupExtension
dal codice? Devo chiamareProvideValue
e quel caso, come faccio a ottenere una sospensione di unIServiceProvider
? *CustomMarkupExtension customExtension = new CustomMarkupExtension(); textBox.Text = customExtension.ProvideValue(??);
ho trovato sorprendentemente poco su questo argomento così, si può fare?
H.B. ha risposto alla domanda. Aggiungo solo alcuni dettagli al motivo per cui ho voluto farlo. Ho provato a creare una soluzione alternativa per il seguente problema.
Il problema è che non è possibile derivare da Binding
e sovrascrivere ProvideValue
poiché è sigillato. Dovrai fare qualcosa di simile a questo: A base class for custom WPF binding markup extensions. Ma il problema è che quando si restituisce un Binding
a un Setter
si ottiene un'eccezione, ma al di fuori dello Style
funziona correttamente.
ho letto in diversi luoghi che si dovrebbe restituire il MarkupExtension
stesso se il TargetObject
è un Setter
per permettergli di reeavaluate una volta che viene applicato ad un vero e proprio FrameworkElement
e questo ha un senso.
- Markup Extension in Data Trigger
- Huge limitation of a MarkupExtension
- A base class for custom WPF binding markup extensions (nei commenti)
tuttavia, che funziona solo quando il TargetProperty
è di tipo object
, altrimenti l'eccezione è tornato. Se si guarda il codice sorgente per BindingBase
si può vedere che fa esattamente questo ma sembra che il framework abbia qualche ingrediente segreto che lo fa funzionare.
Hey H.B. Sì, ho letto anche questo, tuttavia speravo che ci fosse ancora un modo. Questa è una pessima notizia e il custom 'MarkupExtensions' sembra un concetto semi-lavorativo. Non possono essere usati in un 'Setter' di stile se la TargetProperty non è di tipo' object', quindi speravo di aggirare questo problema applicandomi a me stesso in un comportamento collegato, ma il piano è stato risolto. Comunque, grazie per la tua risposta –
@Meleak: beh, come dice il nome MarkupExtensions estende il markup, non sono pensati per essere usati nel codice. A proposito, non riesco a riprodurre alcun problema con l'uso di MarkupExtensions in Setters. –
Sono d'accordo, questo è più che implicito nel nome, speravo ancora in un modo :) Non ero molto chiaro nel mio commento, il problema è quando fornisci un valore 'Binding' a un' Setter'. Hai risposto alla domanda e accetto la tua risposta. Aggiunti alcuni dettagli sul motivo per cui ho voluto farlo nella mia domanda –