2009-03-31 3 views
3

Ich habe ein UserControl, das ein Menü enthält. Ich muss das Menu.Icon an eine Eigenschaft des UserControl binden, aber es funktioniert nicht.WPF - Bindung an ein Menü-Symbol

Der Code beginnt wie folgt -

 <Border Grid.Row="0">    
     <DockPanel> 
      <Image x:Name="testImage" Height="16" Width="16" Source="{Binding ElementName=UC,Path=AddImage}"/> 
      <Menu DockPanel.Dock="Left" Height="20" 
       VerticalAlignment="Center"> 
       <MenuItem Header="{Binding ElementName=UC,Path=AddText}"> 
        <MenuItem.Icon> 
         <!--<Image x:Name="workswhenin" Height="16" Width="16" Source="pack://application:,,/Kowdox;component/Images/UserIcons/user_add.png"/>--> 

         <Image x:Name="realImage" Height="16" Width="16" 
         Source="{Binding ElementName=UC,Path=AddImage}"/> 
        </MenuItem.Icon> 
       </MenuItem> 

Das erste Bild, das Sie sehen erklärt (Testbilder) funktioniert perfekt, so bin ich glücklich, dass die Bindung korrekt ist. Das zweite Image (auskommentiert und 'workswhenin' genannt) enthält den Paket-URI, den ich an die gebundene Eigenschaft von UserControls übergebe, und das funktioniert auch, aber der dritte (realImage) erscheint gar nicht!

Ich kann keinen Grund sehen, warum es nicht funktionieren sollte; Ich weiß, dass die Bindung gut ist, und ich weiß, dass die Platzierung des Bildes im Markup gut ist, also was ist los?

Jede Hilfe wird sehr geschätzt. Vielen Dank im Voraus.

Antwort

5

Kann ich nicht sicher sagen, weil ich Ihren Code nicht sehen kann, aber ich bin mir ziemlich sicher, dass ich weiß, was das Problem ist.

Image.Source erwartet ein Objekt vom Typ ImageSource. Wenn Sie die URL in XAML angeben, wird ein Standard-WPF-Konverter verwendet, um die URL in ein ImageSource Objekt zu konvertieren. Da Sie eine Bindung verwenden, wird der Standardkonverter nicht verwendet. Sie versuchen wahrscheinlich, die Bildquelle auf einen URL-Wert anstelle eines ImageSource Objekts festzulegen.

In Ihrem Code hinter Eigentum müssen Sie ein ImageSource Objekt erstellen, was wirklich ein Schmerz ist. Sie könnten eine BitmapImage erstellen und die URL übergeben.

Die einfachste Lösung besteht darin, den Standardkonverter von Microsoft im Code hinter der Eigenschaft zu verwenden, an die Sie gebunden sind, oder sie explizit in der Bindung zu verwenden. Der Konverter heißt ImageSourceConverter.

EDIT:

Hier ist ein einfaches Beispiel:

-Code innerhalb der Bindungsquelle:

public ImageSource AddImageSource 
{ 
    get 
    { 
     ImageSourceConverter imgConv = new ImageSourceConverter(); 
     return imgConv.ConvertFrom(this.AddImage); 
    } 
} 

aktualisieren die Bindungen diese Eigenschaft zielen, anstatt die AddImage Eigenschaft. Stellen Sie sicher, dass Sie das PropertyChanged-Ereignis für diese Eigenschaft auch dann auslösen, wenn sich die AddImage-Eigenschaft ändert.

Ich habe mir nicht die Zeit genommen, ein Testszenario dafür zu bauen, aber es sollte ohne Probleme funktionieren.

+0

Diese Frage wurde gerade zum 1000sten Mal angeschaut und trotzdem bekommst du (hilfreich und korrekt) nur eine Antwort, ... von mir! Die Leute sollten ihre Stimmen mehr verwenden, wenn sie Antworten nützlich finden. – Stimul8d

+0

@Josh G: Ja, bitte posten Sie den Beispielcode. – kevinarpe

+0

@KCArpe: Fertig. Siehe Bearbeiten. –