2009-11-10 8 views
1

J'ai un ListBox:WPF Liaison de données Erreur dans ListBox

<ListBox x:Name="HistogramListBox" Grid.Column="1" Margin="8,2,8,0" 
     HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
     Template="{StaticResource HistogramListBoxControlTemplate}" 
     ItemContainerStyle="{StaticResource HistogramListBoxItem}" 
     ItemTemplate="{DynamicResource BucketTemplate}" /> 

qui utilise un DataTemplate qui utilise à son tour un ValueConverter pour déterminer la hauteur du ListBoxItem:

<DataTemplate x:Key="BucketTemplate"> 
    <StackPanel> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="100"/> 
      </Grid.RowDefinitions> 
      <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Bottom"> 
       <Rectangle Grid.Row="0" StrokeThickness="1" VerticalAlignment="Bottom" 
          Stroke="{Binding ElementName=MainElement, Path=BucketStroke}" 
          Fill="{Binding ElementName=MainElement, Path=BucketFill}" > 
        <Rectangle.Height> 
         <MultiBinding Converter="{StaticResource HistogramValueToPercentageConverter}"> 
          <Binding Mode="OneWay" Path="ItemCount" /> 
          <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:Histogram}}" /> 
         </MultiBinding> 
        </Rectangle.Height> 
       </Rectangle> 
      </StackPanel> 
     </Grid> 
    </StackPanel> 
</DataTemplate> 

Le ListBoxItemsSource est un int[]. Lorsque j'exécute le code, il est impossible de trouver 'ItemCount' sur un Int32. Je pensais qu'il a eu le nombre d'éléments de la ListBox (je me trompe évidemment).

Quelqu'un peut-il me dire comment je peux obtenir mon ValueConverter pour savoir sur quel article je suis.

Merci

Dan

Répondre

1

En supposant que votre premier paramètre de conversion est destiné à être la valeur réelle étant cartographié et le second la Histogramme objet:

<Rectangle.Height> 
    <MultiBinding Converter="{StaticResource HistogramValueToPercentageConverter}"> 
    <Binding /> 
    <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:Histogram}}" /> 
    </MultiBinding> 
</Rectangle.Height> 

en effet, le DataContext est l'entier lui-même, au moins cela semble être le cas du message d'erreur que vous avez donné. Par ailleurs, vous devez normalement définir ItemsSource de ListBox à l'aide d'une liaison, pas de code-behind. Cela conduit à une séparation beaucoup plus nette de l'interface utilisateur et du code. J'ai remarqué aucun ItemsSource= a été montré dans votre code d'exemple, donc j'ai pensé que je devrais mentionner ceci.

+0

Merci Ray, je savais que c'était quelque chose de stupide qui me manquait –

1

Le contexte de données des éléments du modèle de données est l'élément de données lui-même, qui est un int. Si vous voulez une propriété sur le ListBox, vous devez atteindre en dehors de votre contexte actuel pour le faire. Vous pouvez utiliser un RelativeSource pour ce faire:

{Binding Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}} 
+0

Je suis assez sûr que ListBox n'a pas de propriété ItemCount, n'est-ce pas? –

+0

@Drew: vrai. Je viens de copier l'OP. Mise à jour de mon message –

+0

Items.Count me donne le nombre total d'articles. Je cherchais l'objet qu'il est actuellement dans la liste. Merci –

0

Vous pouvez essayer pour votre Reliure:

<Binding Path="Items.Count"> 
    <Binding.RelativeSource> 
     <RelativeSource AncestorType="{x:Type ListBox}" /> 
    </Binding.RelativeSource> 
</Binding> 
Questions connexes