2009-04-03 4 views
1

Das ist ohne Zweifel eine neue Frage, aber ich habe nach einer vergeblichen Antwort gesucht. Mein Setup ist einfach: Ich habe ein ListBox-Steuerelement in XAML und ein in der gleichen Klasse definiert. Ich bin die an die ListBox binden.Silverlight - Bindung mit ObservableCollections

Innerhalb der Hierarchie dieser ListBox in XAML möchte ich an ein bestimmtes MyClass-Objekt binden, nicht an eine untergeordnete Eigenschaft des MyClass-Objekts.

Um zu klären, ich XAML, die die folgenden (binde ich die ObservableCollection in Code) sieht so aus: es

<ListBox x:Name="MyListBox"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <MyControls:SpecialControl MyClassObj="{Binding !!!}" /> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
    </ListBox> 

Sicherlich ist ein Weg, um das Objekt einer ObservableCollection zu bekommen, anstatt zu binden gezwungen zu sein, zu einer seiner untergeordneten Eigenschaften.

Antwort

3

Sie haben eine Path nicht angeben, wenn Sie das gebundene Objekt verwenden möchten selbst:

<ListBox x:Name="MyListBox"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <MyControls:SpecialControl MyClassObj="{Binding}" /> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

BTW: Statt der benutzerdefinierten Eigenschaft können Sie die DataContext Eigenschaft Ihrer Steuerung verwenden, um die Steuerung zu binden zum Objekt:

<ListBox x:Name="MyListBox"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <MyControls:SpecialControl DataContext="{Binding}" /> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

Dank! Du scheinst meine Gedanken gelesen zu haben, indem ich vorgeschlagen habe, direkt an DataContext zu binden. Das ist mir nie in den Sinn gekommen, aber genau das möchte ich tun. – JubJub

0

Neben der Angabe des Bindungspfads in Ihrem XAML müssen Sie Ihre Sammlung an die ListBox binden.

C#

ObservableCollection<MyClass> myCollection = new ObservableCollection<MyClass>(); 
MyListBox.DataContext = myCollection; 

Die XAML Sie verwendet haben, vor allem nicht sein nützlich, wenn Sie die ToString-Methode auf MyClass außer Kraft gesetzt haben. Obwohl Sie sagen, dass Sie nicht sind, sind Sie sicher, dass es keine Eigenschaft von MyClass ist, an die Sie binden möchten? Ich kann nicht erkennen, warum Sie direkt an ein Sammlungsobjekt binden möchten.

XAML

<ListBox x:Name="MyListBox"> 
    <ListBox.ItemTemplate>  
     <DataTemplate>  
      <MyControls:SpecialControl MyClassObj="{Binding Path=MyClassProperty}" />  
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

Das SpecialControl muss Eigenschaften des Objekts an einige seiner untergeordneten Elemente binden. Vielleicht mache ich das improvisiert, aber ich sehe keine bessere Methode, wenn ich möchte, dass die SpecialControl autonom ist. – JubJub

+0

das macht für mich keinen Sinn. Wie verknüpft MyClassProperty den XAML mit dem C# -Code? – xarzu