2013-03-26 9 views
6

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> 
... 
+0

È possibile inserire il codice in cui si definisce la risorsa "imageSource"? –

risposta

1

Si potrebbe provare a definire "imageResource" come ImageSource invece di un Image. Questo funziona per me.

<r:RibbonWindow 
    x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" 
    xmlns:pc="clr-namespace:System.Windows.Media;assembly=PresentationCore"> 
    <Grid> 
     <Grid.Resources> 
      <pc:ImageSource x:Key="imageSource">your_image.png</pc:ImageSource> 
     </Grid.Resources> 
     <r:Ribbon> 
      <r:RibbonMenuButton 
       IsEnabled="{Binding ForegroundIsConfigurable}" 
       SmallImageSource="{DynamicResource imageSource}"> 
      </r:RibbonMenuButton> 
     </r:Ribbon> 
    </Grid> 
</r:RibbonWindow> 

Inoltre, è possibile impostare il DataContext del vostro RibbonMenuButton senza sostituire IsEnabled utilizzando un ElementName rilegatura nel modo seguente.

<r:RibbonWindow x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" 
     Title="MainWindow" Height="350" Width="525"> 

    <Grid x:Name="root"> 

     <Grid.Resources> 
      <Image x:Key="imageSource" Source="{Binding myImageSource}"/> 
     </Grid.Resources> 

     <r:Ribbon> 
      <r:RibbonMenuButton DataContext="{DynamicResource imageSource}" 
       IsEnabled="{Binding ElementName=Root, Path=DataContext.ForegroundIsConfigurable}" 
       SmallImageSource="{Binding Source}"/> 
     </r:Ribbon> 
    </Grid> 
</r:RibbonWindow> 
+0

Penso che la seconda idea potrebbe funzionare. Ci proverò domani. La prima idea, tuttavia, non funzionerà. Ho dimenticato di dire che dipingo l'immagine da sola, non c'è immagine a cui collegarmi. – Em1

+0

@ Em1 Per quanto riguarda la prima idea, è possibile aggiornare immediatamente la chiave imageSource del dizionario risorse se si ha accesso ad essa dal codice che dipinge le immagini. –

+0

Ho appena testato il secondo approccio. Per qualche ragione non ha funzionato per me con ElementName ma con RelativeSource. - Dipingo l'immagine in XAML, ho aggiornato la domanda a riguardo. Non ho eseguito il debug nel problema relativo al fatto che quando viene utilizzato direttamente ImageSource (anziché Image.Source) non è possibile aggiungere il contenuto. – Em1