In primo luogo il codice di quello che stavo iniziando da:binding dinamico ad un "percorso" della risorsa
<ribbon:RibbonMenuButton IsEnabled="{Binding ForegroundIsConfigurable}"
SmallImageSource="{Binding Source={StaticResource imageSource},
Path=Source,
UpdateSourceTrigger=OnPropertyChanged}">
Anche se questo legame è compilare ed eseguire bene il motivo per cui non sono soddisfatto è che imageSource
cambiamenti durante il runtime.
StaticResource Markup Extension : Provides a value for any XAML property attribute by looking up a reference to an already defined resource. Lookup behavior for that resource is analogous to load-time lookup, which will look for resources that were previously loaded from the markup of the current XAML page as well as other application sources, and will generate that resource value as the property value in the run-time objects.
Dal imageSource
valore che cambia durante l'esecuzione ho dovuto cambiare StaticResource
a DynamicResource
. Ma la proprietà Source
non è una proprietà di dipendenza e, quindi, il seguente codice genererà un errore di runtime:
SmallImageSource="{Binding Source={DynamicResource imageSource},
Path=Source,
UpdateSourceTrigger=LostFocus}
Per questo motivo ho bisogno di impegnare la dinamica delle risorse direttamente a SmallImageSource
, che è una proprietà di dipendenza:
SmallImageSource="{DynamicResource imageSource}"
Questo di nuovo genererà un errore di runtime perché imageSource
è il tipo di Image
. SmallImageSource
si aspetta che il valore sia il tipo di ImageSource
.
Si potrebbe suggerire ora di impostare il contesto dei dati sulla mia risorsa dinamica e associare la proprietà in modo appropriato. Se lo faccio, ucciderei il binding della proprietà IsEnabled
che ha un altro DataContext
.
E per quanto ne so, MultiBinding
non è una soluzione poiché fornisce un meccanismo per associare una proprietà a più origini ma non fornisce proprietà di binding diverse rispetto a diversi contesti e origini.
Mentre pensavo a come andare avanti, mi è venuto in mente che per fortuna posso spostare il rigmarole ImageSource
in un IValueConverter
. Nel dato contesto dati del mio RibbonMenuButton
ho un valore di stringa con il valore appropriato che è in realtà anche la fonte del mio ImageSource
.
In ogni caso, mi chiedo ancora come risolverei il problema se non avessi l'altro approccio, cioè se entrambe le fonti fossero in diversi contesti di dati. C'è qualcosa che non vedo? Come posso garantire di non uccidere l'altra associazione sovrascrivendo lo DataContext
e vincolando una proprietà di una risorsa dinamica?
Il imageSource
è abbastanza lo stesso come l'esempio XAML sul DrawingImage msdn page.
<Image x:Key="imageSource">
<Image.Source>
<DrawingImage>
...
È possibile inserire il codice in cui si definisce la risorsa "imageSource"? –