2010-03-19 3 views
8

Ich habe Suche hoch und niedrig und kann keine Antwort darauf finden. Ich habe zwei FragenHinzufügen Sammlung oder Array zu WPF Ressource Wörterbuch

  1. Wie erstellen Sie ein Array oder eine Sammlung in XAML. Ich habe ein Array, das ich dort festhalten und an eine Combobox binden möchte. Meine erste Idee war, ein ItemsControl in ein Ressourcenwörterbuch zu stellen, aber die ItemsSource eines Kombinationsfelds erwartet IEnumerable, so dass es nicht funktionierte.

Hier ist, was ich in meinem Ressource Wörterbuch versucht haben und weder funktioniert

<ItemsControl x:Key="stateList"> 
    <sys:String>AL</sys:String> 
    <sys:String>CA</sys:String> 
    <sys:String>CN</sys:String> 
</ItemsControl> 
<ItemsControl x:Key="stateList2"> 
    <ComboBoxItem>AL</ComboBoxItem> 
    <ComboBoxItem>CA</ComboBoxItem> 
    <ComboBoxItem>CN</ComboBoxItem> 
</ItemsControl> 

und hier ist, wie ich es binden

<ComboBox SelectedValue="{Binding Path=State}" ItemsSource="{Binding Source={StaticResource stateList2}}" > 

        </ComboBox> 

EDIT: AKTUALISIERT

ich diese bekam erster Teil, um so zu arbeiten

<col:ArrayList x:Key="stateList3"> 
    <sys:String>AL</sys:String> 
    <sys:String>CA</sys:String> 
    <sys:String>CN</sys:String> 
</col:ArrayList> 

Allerdings würde ich lieber keine Array-Liste verwenden, ich würde gerne eine generische Liste verwenden, wenn jemand weiß, wie bitte lass es mich wissen.

EDIT UPDATE: Ich denke, XAML für Generika so vielleicht eine Array-Liste sehr begrenzte Unterstützung hat, ist das Beste, was ich jetzt tun kann, aber ich würde immer noch Hilfe gerne auf die zweite Frage, ob jemand eine Anser

2. hat . Ich habe versucht, ein verschmolzenes Ressourcenwörterbuch in meinem XAML zu referenzieren und hatte Probleme, weil ich unter Window.resources mehr als nur das Wörterbuch hatte, also erforderte ich, dass x: Key hinzugefügt wurde. Sobald ich den Schlüssel hinzugefügt habe, kann das System die Elemente in meinem Ressourcenwörterbuch nicht mehr finden. Ich musste stattdessen das zusammengeführte Wörterbuch zu Grid.Resources verschieben. Idealerweise möchte ich auf das zusammengeführte Wörterbuch in der app.xaml verweisen, aber ich habe das gleiche Problem

Hier ist ein Beispielcode. Dieser erste Teil erforderlich, um eine x: Schlüssel zu kompilieren, weil ich Wandler haben und sie beschwerten sich, dass jedes Element einen Schlüssel haben müssen, wenn es mehr als einen

<UserControl.Resources> 
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/ResourcesD.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

Ich hatte es zu diesem

<UI:BaseStep.Resources> 
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />    
</UI:BaseStep.Resources> 
<Grid> 
    <Grid.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="/ResourcesD.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Grid.Resources> 
</Grid> 
zu ändern

Vielen Dank

Antwort

14

Soweit ich Ihr Problem verstehen wollen Sie eine ComboBox binden (oder ein List-Box) mit einem Array von Gegenständen, richtig? Wenn Sie Elemente aus einer externen Datenquelle möchten, können Sie einfach die praktische DataContext-Eigenschaft verwenden. Suchen Sie in MSDN nach mehr darüber. Wenn Sie jedoch eine manuelle Sammlung tun wollen, tun Sie es so:

Erstellen Sie Ihre eigene Klasse:

public class StringCollection : ObservableCollection<string> { } 

und jetzt ist es wie folgt verwenden:

<Window.Resources> 
    <local:StringCollection x:Key="stringCollection"> 
     <sys:String>Hello</sys:String> 
     <sys:String>World</sys:String> 
    </local:stringCollection> 
</Window.Resources> 

... 

    <ListBox 
     Margin="15" 
     ItemsSource="{StaticResource stringCollection}" /> 

Oder, wenn Sie wollen

public class ObjectCollection : ObservableCollection<object> { } 

und es wie folgt verwenden: allgemeinere Sammlung eine Klasse wie folgt erstellen

<local:ObjectCollection x:Key="objectCollection"> 
     <sys:String>Hello</sys:String> 
     <TextBlock>World</TextBlock> 
     <sys:Int32>12345</sys:Int32> 
    </local:ObjectCollection> 

    ... 

    <ComboBox 
     Margin="15" 
     ItemsSource="{StaticResource objectCollection}" /> 



Sie können auch Verwendung von einigen in-built-Klassen wie Int32Collection zu machen, die IEnumerable implementiert. Sie können sie direkt als Ressource verwenden.


Die Resources Eigenschaft (von jedenFrameworkElement wie Window, UserControl oder Application) vom Typ ResourceDictionary nicht Sammlung von Ressourcen Wörterbücher! so dass Sie nicht wie folgt tun:

<UserControl.Resources> 

    <!-- The first RD --> 
    <!--<ResourceDictionary> 
     <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    </ResourceDictionary>--> 

    <!-- Second RD!!! --> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/ResourcesD.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

Statt wie folgt tun:

<UserControl.Resources> 

    <!-- 
     There should be only 1 main RD, 
     Merge other RDs, if any 
    --> 
    <ResourceDictionary> 

     <!-- First Resource --> 
     <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 

     <!-- Second Resource --> 
     <ResourceDictionary.MergedDictionaries> 
      <!-- Now, there can be multiple RDs --> 
      <ResourceDictionary Source="/ResourcesA.xaml" /> 
      <ResourceDictionary Source="/ResourcesB.xaml" /> 
      <ResourceDictionary Source="/ResourcesC.xaml" /> 
      <ResourceDictionary Source="/ResourcesD.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 

</UserControl.Resources> 

Hoffnung, das hilft.
Grüße,
Mihir Gokani

+0

Das ist ein interessanter Ansatz, in meinem Fall muss es nicht wirklich beobachtbar sein, aber ich nehme an, es würde in meinem Fall funktionieren.Eine Idee zur Lösung des anderen Problems der Bereitstellung eines Ressourcenschlüssels und Wenn die Auflösung fehlschlägt –

+0

OK, ich habe eine Antwort für Ihre zweite Frage hinzugefügt: Ist das, was Sie suchen? – mg007

+0

oops! Ich denke meine zweite Antwort ist ähnlich der von @Abe – mg007

1

Bitte korrigieren Sie mich, wenn ich falsch liege, aber ich denke, Sie wollen etwas wie das?

<Grid.Resources> 
    <local:MyCustomCollection x:Key="local:MyCustomCollection"/> 
</Brid.Resources> 

An der Spitze des Fensters Sie eine Eigenschaft haben würde:

xmlns:local="clr-namespace:MyNamespace" 

Und in Ihrem Code müssten Sie:

MyCustomCollection custCol = MyGrid.Resources["MyCustomCollection"] as MyCustomCollection; 

Bindung an einer Steuer passieren würde, mit eine Eigenschaft etwas wie diese:

ItemsSource="{StaticResource MyCustomCollection}" 
+0

Nicht wirklich. Ich möchte eine Sammlung in einem Ressourcenwörterbuch, da ich die Sammlung für mehrere Steuerelemente und Fenster freigeben möchte. Es ist eine Liste von Staaten. Ich möchte in der Lage sein, an die Liste der Staaten zu binden. Ich möchte im Code dahinter nicht darauf zugreifen. –

+0

OK Entschuldigung, ich bin nicht sicher bei der Hand, ich behalte diese Antwort hier für den Fall, dass es anderen hilft. –

0

Wenn Sie ein Ressourcenwörterbuch in Windows-Ressourcen hinzufügen, können Sie nicht überall darauf zugreifen. Stattdessen sollten Sie die Ressourcen von "App" hinzufügen (siehe App.xaml-Datei).

<App.Resources> 
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/ResourcesD.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</App.Resources> 

Dies wird in jedem WPF-Objekt zur Verfügung steht, unabhängig jede Vererbungshierarchie zu schaffen.

+0

Ich habe das versucht und es ist, was ich wollte, aber es beschwert sich immer noch über benötigt einen Ressourcenschlüssel und wenn ich den Ressourcenschlüssel hinzufügen, löst es nicht mehr auf. –

+0

Ich denke, Sie können Ihren Konverter in Ihre ResourcesD.xaml verschieben und dann können Sie nur ein Ressourcenwörterbuchelement haben. –

+0

Nun, ich habe mehrere andere Ressourcen in der app.xaml, ich müsste sie alle verschieben. Irgendetwas wirkt da seltsam. Muss ich irgendwie mit der x: Schlüsselreferenz an es binden. –

1

Für die Ressourcen, brauchen Sie nur Ihre zusätzlichen Konverter in die neu deklarierte Resource Mover:

<App.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/ResourcesD.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 

    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    </ResourceDictionary> 
</App.Resources> 
Verwandte Themen