Question

J'ai recherche haut et bas et ne peut pas trouver une réponse à cette question. J'ai deux questions

  1. Comment créer un tableau ou d'une collection en XAML. J'ai un tableau que je veux rester là-bas et se lier à une zone de liste déroulante. Ma première idée était de mettre un ItemsControl dans un dictionnaire de ressources, mais le ItemsSource d'une zone de liste déroulante attend IEnumerable si cela ne fonctionne pas.

Voici ce que j'ai essayé dans mon dictionnaire de ressources et ne travaille

<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>

et voici comment je lie à elle

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

                    </ComboBox>

EDIT: MISE À JOUR

Je suis arrivé cette première partie de travailler de cette façon

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

Cependant, je préfère ne pas utiliser une liste de tableau, je voudrais utiliser une liste générique si quelqu'un sait comment s'il vous plaît laissez-moi savoir.

EDIT MISE À JOUR: Je suppose que XAML a un soutien très limité pour les médicaments génériques alors peut-être une liste de tableau est le meilleur que je peux faire pour l'instant, mais je reste comme aide à la deuxième question, si quelqu'un a un Anser

2. Je l'ai essayé le référencement d'un dictionnaire fusionné des ressources dans mon XAML et avait des problèmes parce que sous Window.resources j'ai eu plus que le dictionnaire il me nécessaire d'ajouter x: Key. Une fois que j'ajouter la clé, le système ne peut plus trouver les articles dans mon dictionnaire de ressources. Je devais déplacer le dictionnaire fusionné à la place Grid.Resources. Idéalement, je voudrais faire référence au dictionnaire fusionné dans le app.xaml mais j'ai le même problème

Voici quelques exemples de code. Cette première partie a nécessité un x: clé pour compiler parce que j'ai convertisseur et il se plaignait que chaque élément doit avoir une clé s'il y a plus d'un

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

Je devais changer à cette

<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>

Merci

Était-ce utile?

La solution

Pour autant que je comprends votre problème, vous voulez lier une zone de liste déroulante (ou un ListBox) avec une gamme d'articles, non? Si vous voulez que les éléments d'une source de données externe, vous pouvez simplement utiliser la propriété DataContext à portée de main. Rechercher MSDN pour plus de détails. Cependant, si vous voulez une collecte manuelle, faites-le de cette façon:

Créez votre propre classe:

public class StringCollection : ObservableCollection<string> { }

et utiliser maintenant comme ceci:

<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}" />

Ou, si vous voulez collection plus générique créer une classe comme ceci:

public class ObjectCollection : ObservableCollection<object> { }

et l'utiliser comme ceci:

    <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}" />


Vous pouvez également utiliser certaines classes construites comme Int32Collection qui met en oeuvre IEnumerable. Vous pouvez les utiliser directement comme ressource.


La propriété Resources ( any FrameworkElement comme Window, UserControl ou Application) est de type ResourceDictionary pas collection de dictionnaires de ressources! de sorte que vous ne peuvent pas faire comme ceci:

<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>

Au lieu de cela faire comme ceci:

<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>

Espérons que cela aide.
Cordialement,
Mihir Gokani

Autres conseils

S'il vous plaît me corriger si je me trompe, mais je pense que vous voulez quelque chose comme ça?

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

En haut de votre fenêtre, vous auriez une propriété:

xmlns:local="clr-namespace:MyNamespace"

Et à l'intérieur de votre code que vous auriez:

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

La liaison se passerait-il sur un contrôle avec quelque chose de bien comme ceci:

ItemsSource="{StaticResource MyCustomCollection}"

Pour les ressources, il vous suffit de mover votre convertisseur supplémentaire dans le ResourceDictionary nouvellement déclaré:

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

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

Si vous ajoutez le dictionnaire des ressources à l'intérieur des ressources de la fenêtre, vous ne serez pas en mesure d'accéder partout, au lieu, vous devez ajouter des ressources de l ' « App » (consultez le fichier App.xaml).

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

Ce sera disponible dans tous les objets WPF quelle que soit la création d'une hiérarchie d'héritage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top