2009-05-25 7 views
1

i tat dies:Wie binden Sie an eine Sammlung, die in einem anderen Projekt/Namespace enthalten ist?

this.combobox.ItemsSource = Common.Component.ModuleManager.Instance.Modules; 

die Combobox zu einer Sammelstelle zu binden, die in einem anderen Projekt/Namespace befindet. Aber ich musste die ComboBox in eine DataTemplate verschieben.

Jetzt brauche ich, so etwas zu tun:

<ComboBox ItemsSource="{Binding Common.Component.ModuleManager.Instance.Modules}"/> 

Ich will nicht alle meine Versuche verzeichnen, aber keiner war erfolgreich.
Irgendwelche besseren Ideen?

+0

Ich habe gerade kompiliert und ein Programm mit Ihrem genauen Code ausgeführt - hat gut funktioniert. Das einzige, was ich nicht getan habe, war, die Klasse in eine andere Versammlung zu bringen. Es muss mehr geben, als das Auge sieht. –

+0

Gibt Ihnen die XamlParseException irgendwelche Details darüber, worüber sie sich besonders beschweren? Geht es weg, wenn Sie das ItemsSource-Attribut aus der ComboBox entfernen? –

+0

Ja, wenn ich das ItemsSource-Attribut entferne, gibt es keine Ausnahme. Und es gibt keine spezielle Beschwerde über die Stacktrace, die ich sehen konnte. Aber ich habe es hochgeladen, vielleicht finden Sie etwas, das ich vermisst habe. http://www.informatik.uni-rostock.de/~mb004/XamlParseException.txt (Sorry über die deutsche dort) –

Antwort

3

Sie benötigen die .NET-Namespace in eine XML-Namespace an der Spitze der XAML-Datei zur Karte:

<Window 
    x:Class="WindowsApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:q="clr-namespace:Common.Component"> 

So, jetzt „q“ ist mit dem „Common.Component“ Namespace zugeordnet. Statische Markuperweiterung die statische „Instanz“ Eigentum Ihrer Module Klasse zugreifen: Jetzt können Sie die x verwenden

<ComboBox 
    ItemsSource="{Binding Modules,Source={x:Static q:ModuleManager.Instance}}" /> 

Sehen, ob das für Sie arbeitet.

bearbeiten

Eine weitere Sache: Wenn Ihr "Common.Component" Namespace in einer separaten Assembly lebt, müssen Sie die XAML sagen, dass:

xmlns:q="clr-namespace:Common.Component;assembly=CommonAssemblyFilename" 
+0

Dies endet in einer XamlParseException beim Laden der ComboBox –

+0

VS diese automatisch hinzugefügt. –

+0

Hat es getan? Das ist ... komisch. Nie gesehen VS das tun. Ok, kannst du deine Frage mit weiteren Details zur Klasse "ModuleManager" aktualisieren? Habe ich recht, dass das die Klasse und die Instanz eine statische Eigenschaft ist? 'Coz, dass XAML funktionieren sollte. –

0

auf einem nicht verwandten Notiz könnte Sie Sie möchten stattdessen eine Leistung für eine Observable-Sammlung festlegen. Weitere WPF-Optimierungsdetails here.

Bindung IEnumerable zu einem Item zwingt WPF einen Wrapper IList < (Of < (T>)>) -Objekt zu erstellen, die Ihre Leistung bedeutet, durch den unnötigen Aufwand eines zweiten Objekts beeinflusst.

+0

Ich brauche keine ObservableCollection. Die Sammlung ändert sich nie nach dem Start des Projekts. –

0

Ok, ich habe einen Workaround gefunden. Es muss ein Problem geben, wenn die Sammlung in einer anderen Assembly enthalten ist.

Ich habe der Assembly von XAML und Binding eine neue Klasse hinzugefügt.

public static class ResourceHelper 
{ 
    public static IEnumerable<Common.Component.Module> Modules = Common.Component.ModuleManager.Instance.Modules; 
} 

Dann wechselte ich zu

die Bindung
<ComboBox ItemsSource="{Binding Path=.,Source={x:Static e:ResourceHelper.Modules}}"/> 

Und das funktioniert gut.
Thx Matt für Ihre Hilfe.

+0

Ich verstehe es immer noch nicht. Auf diese Weise habe ich Sammlungen in anderen Baugruppen verwendet. Trotzdem bin ich froh, dass es funktioniert hat! –

+0

Ich verstehe es auch nicht. Ich habe einige Teile des Projekts geändert und jetzt bekomme ich diese Excetion wieder, aber nicht auf jedem PC. Es sieht so aus, als ob dieses Problem von tiefem inneren wpf kommt. –

Verwandte Themen