2010-10-24 3 views
7

je ne sais pas ce que je fais mal ici ...UI WPF pas mis à jour lors d'un changement de propriété

J'ai un Hashtable personnalisé qui a une méthode qui permet à quelqu'un de supprimer un « partNumber » (une valeur) depuis le HashTable.

La méthode de suppression est la suivante:

class COSC202HashTable : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    //.... 
    private List<int> underlyingList; 
    //... 
    public List<int> HashList { get { return underlyingList; } } 

    public void Delete(int partNumber) 
    { 
      string theAlgoritnm = Algorithm; 
      if (String.Compare(theAlgoritnm, "Modulo Division") == 0 && String.Compare(Probe, "Linear Collision Resolution") == 0) 
      { 
       LinearModularDivision(partNumber, false); 
      } 
      if (String.Compare(theAlgoritnm, "Modulo Division") == 0 && String.Compare(Probe, "Key Offset Collision Resolution") == 0) 
      { 
       KeyOffsetModularDivision(partNumber, false); 
      } 
      if (String.Compare(theAlgoritnm, "Pseudorandom") == 0) 
      { 
       Pseudorandom(partNumber, false); 
      } 
      if (String.Compare(theAlgoritnm, "Rotation") == 0) 
      { 
       Rotation(partNumber, false); 
      } 

      NotifyPropertyChanged("HashList"); 
    } 
    //....... 
    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

Je lient les valeurs sous-jacentes de l'Hashtable à l'interface utilisateur; Cependant, l'interface utilisateur n'est pas mise à jour après la suppression d'une valeur. Je me suis assuré qu'il n'y a pas de problèmes avec l'orthographe etc ...

C'est le balisage que j'ai pour mon interface WPF:

<Window.Resources> 
    <COSC202:COSC202HashTable x:Name="TheHashTable" x:Key="TheHashTable" PropertyChanged="TheHashTable_PropertyChanged"></COSC202:COSC202HashTable> 
</Window.Resources> 
<ListView x:Name="HashResults" Height="32" Width="1200" Margin="10" HorizontalAlignment="Right" 
         DataContext="{Binding Source={StaticResource TheHashTable}}" ItemsSource="{Binding Path=HashList}" HorizontalContentAlignment="Left"> 
    <ListView.Background> 
     <LinearGradientBrush StartPoint="0,0" EndPoint="0,2"> 
      <GradientStop Color="#FF000000" Offset="0"></GradientStop> 
      <GradientStop Color="DarkBlue" Offset="1"></GradientStop> 
     </LinearGradientBrush> 
    </ListView.Background> 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"></StackPanel> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 

    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal" > 
       <TextBlock Text="{Binding Path=.}" FontSize="11" Foreground="Azure" VerticalAlignment="Top" ></TextBlock> 
       <Label Content="|" VerticalAlignment="Top" FontSize="5"></Label> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

Voici le code que je fais appel à supprimer l'élément dans la HashTable au clic du bouton:

private void DeleteItem_Click(object sender, RoutedEventArgs e) 
     { 
      Object item = HashResults.SelectedItem; 
      COSC202HashTable theHashTable = (COSC202HashTable)this.Resources["TheHashTable"]; 
      if (theHashTable != null && item != null) 
      { 
       theHashTable.Delete((int)item); 
      } 
      HashResults.SelectedIndex = -1; 

     } 

Qu'est-ce que je fais mal?

Merci,

-Frinny

+0

Sans rapport avec votre question, mais pourquoi utilisez-vous 'String.Compare()' au lieu de '=='? – svick

+0

Parce que c'est comme ça que je suis habitué à faire les choses. Je travaille principalement avec VB.NET et j'ai trouvé que c'était la meilleure façon de comparer les chaînes. – Frinavale

Répondre

5

Le premier endroit pour rechercher des erreurs de liaison dans la fenêtre de sortie, cela très souvent vous diriger dans la bonne direction.

Si vous liez une collection personnalisée, vous devrez peut-être implémenter INotifyCollectionChanged. Ou envisagez de remplacer votre source de données par ObservableCollection ou, dans votre cas, vous aurez besoin de ObservableDictionary.

aussi vous avez mentionné les fautes d'orthographe, il y a deux façons de faire en sorte que ce n'est pas un problème, consultez la base de MVVM Foundation de ObservableObject

Votre code manque quelques détails, comme votre déclaration pour la StaticResource TheHashTable.

Edit: Raising PropertyChanged contre une classe de liste ne sera pas informer des changements dans cette liste, si vous avez besoin de l'interface utilisateur de voir des changements dans la liste changer le type de liste à ObservableCollection ou créer une nouvelle propriété:

public ObservableCollection Hash 
{ 
    get 
    { 
    return new ObservableCollection(this.HashList); 
    } 
} 

et lier à la propriété Hash.

+0

Je ne suis pas lié à une collection personnalisée. Je lie à une classe HashTable personnalisée. Les valeurs de ce HashTable sont stockées dans une liste .... Je ne pense pas que l'INotifyCollectionChanged m'aidera dans ce cas mais merci pour cette information car je ne connaissais pas cette interface avant de l'avoir publiée. J'ai modifié mon post original pour contenir la déclaration XAML de TheHashTable. – Frinavale

+0

Je viens de l'exécuter à nouveau et il n'y a pas d'erreurs dans la fenêtre de sortie. – Frinavale

+0

J'ai également mis à jour mon article original afin qu'il montre plus d'implémentation pour la classe HashTable personnalisée avec laquelle je travaille. – Frinavale

Questions connexes