2010-12-09 35 views
1

Toute aide à ce sujet est vraiment appréciée. En résumé, j'essaye de créer une base de données vers les propriétés d'une classe personnalisée instanciée dans xaml qui forme alors le contenu d'un listboxitem (phew!).Puis-je créer une base de données avec les propriétés d'une classe personnalisée (instanciée dans xaml) qui forme alors le contenu d'une liste de modèles?

J'ai une simple classe C# appelée MenuItem. Il a deux propriétés: - Rubrique - Icône

Se concentrer sur un de ces éléments de menu (par exemple pour fournir un exemple simple d'où je suis coincé) Si je fais ça (avec les valeurs codés en dur), il fonctionne très bien :

<ListBox> 
    <ListBoxItem ContentTemplate="{StaticResource MenuItemTemplate}"> 
     <myclasses:MenuItem Heading="News" IconImage="News.png"/> 
    </ListBoxItem> 
</Listbox> 

Où MenuItemTemplate est un DataTemplate approprié dans la section des ressources liant chaque propriété) contenant des lignes telles que:

<TextBlock x:Name="tbHeading" Text="{Binding Heading}"> 

Wheareas lorsque je tente d'utiliser la liaison pour définir le cap prope rty il tombe (erreur de AG_E_PARSER_BAD_PROPERTY_VALUE) - .: par exemple

<ListBox> 
    <ListBoxItem ContentTemplate="{StaticResource MenuItemTemplate}"> 
     <myclasses:MenuItem Heading="{Binding NewsHeading, Mode=OneWay}" Icon="News.png"/> 
    </ListBoxItem> 
<Listbox> 

Je me suis demandé si c'est parce que je fais une sorte de double liaison (à savoir le modèle lie à une valeur de la classe MenuItem qui doit être liée) et ce n'est pas possible? J'ai essayé d'avoir les propriétés déclarées en tant que propriétés de dépendance, mais pas de différence (bien que je ne connaisse ces propriétés qu'aujourd'hui, il me manque peut-être quelque chose). Je sais que je pourrais placer les objets menuitem dans le modèle de vue, et les lier à partir de là, mais je voudrais comprendre pourquoi ce qui précède ne fonctionne pas (comme pour mes fins il y a des avantages à construire les éléments de menu dans le xaml).

Merci !!!! Ian


Merci pour cela. Je suis d'accord la zone de liste pourrait ne pas être nécessaire - mais même si je réduis à un seul élément dans un ContentControl:

<ContentControl ContentTemplate="{StaticResource MenuItemTemplate}"> 
    <myclasses:MenuItem Heading="{Binding NewsHeading, Mode=OneWay}" IconImage="News.png"/> 
</ContentControl> 

J'ai toujours le même problème - qui est que je peux obtenir databinding pour travailler dans le contenu de un contentcontrol (avant qu'il ne soit présenté par le datatemplate référencé dans ContentTemplate) en utilisant purement xaml.

à savoir le peu au-dessus de XAML ne fonctionne pas - il renvoie une erreur sur le bit qui lie le NewsHeading:

Heading="{Binding NewsHeading, Mode=OneWay} 

Je suis en train de comprendre si ce que je fais est impossible, ou que ce soit, mais je Je me trompe.

Merci.

Répondre

0

En supposant que vous avez plusieurs classes MenuItem (parce que vous les mettez dans une liste et ti n'aurait pas de sens de le faire si vous en aviez juste un). Vous devez lier la collection à la propriété ItemsSource du ListBox.

somehting comme ceci:

<ListBox ItemsSource="{Binding MyMenuItems}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Heading}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Notez que la suppose que vous avez défini ci-dessus DataContext sur la page à un objet avec une propriété appelée MyMenuItems qui est une collection de vos objets MenuItem.

Pour voir un exemple complet de ceci, regardez le code par défaut créé lorsque vous créez une nouvelle "application Windows Phone Databound".

Edit:
Sur la base de vos commentaires, il semble qu'une ListBox n'est pas la solution la plus adaptée à vos besoins. Un ListBox est conçu/prévu pour prendre une collection d'éléments et les afficher dans une liste.

Si vous avez un certain nombre d'objets différents que vous connaissez au moment du design et que vous souhaitez simplement les avoir l'un sur l'autre (en donnant l'apparence d'une liste), vous pouvez simplement les placer dans un ScrollViewer et/ou StackPanel (ou autre contenant approprié). De plus, vous seriez toujours en mesure de vous connecter si vous le faisiez de cette façon.

+0

Salut Matt - merci de répondre - mais ce n'est pas ce que je cherche. Dans mon cas, je veux pouvoir avoir différents types d'éléments dans ma listbox (donc je ne peux pas simplement me lier à une collection standard). Je connais un moyen de le faire (en utilisant un équivalent WP7 d'un DataTemplateSelector pour appliquer dynamiquement un modèle basé sur le type d'élément) mais j'espérais pouvoir le faire de manière déclarative dans le Xaml (car cela fournit un meilleur aperçu de conception). J'ai donc besoin d'une manière d'avoir une liste qui peut montrer par exemple. un menuitem, puis un autre type d'objet, puis un autre menuitem. – Ian

+0

@Ian comment pourriez-vous spécifier cela au moment du design si vous ne savez pas ce que les éléments sont jusqu'à l'exécution? Si vous savez ce qu'ils peuvent être, alors le 'DataTemplateSelector' est le chemin à parcourir. Sachez que le fait d'avoir différents éléments dans une liste peut avoir un impact sur les performances lorsque la liste s'allonge. –

+0

Je l'ai fonctionné en utilisant un DataTemplateSelector personnalisé (pas nativement disponible dans WP7), mais le problème est (dans wp7 de toute façon) il exige que tous les éléments soient configurés dans le code. Je préférerais de beaucoup les éléments de la listbox à mettre en place dans Xaml. De cette façon (par exemple un concepteur) peut spécifier quels éléments doivent apparaître sur une page de menu, avec quelles images, et dans quel ordre - sans avoir à se soucier du code dans le modèle de vue. Toutefois, certains éléments nécessitent un texte de base de données (par exemple des traductions d'un en-tête de menu ou un message de statut), de sorte que je souhaitais toujours que la liaison de données soit disponible. J'espère que cela l'explique. – Ian