2010-10-24 6 views
7

Ich bin nicht sicher, was ich falsch hier tun ...WPF UI nicht auf Eigenschaftsänderung aktualisiert

ich eine benutzerdefinierte HashTable haben, die eine Methode hat, dass jemand ein „partnumber“ löschen können (ein Wert,) von der HashTable.

Die Löschmethode ist wie folgt:

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)); 
     } 
    } 
} 

I zugrunde liegenden Werte in die UI der HashTable ist am Bindung; Die Benutzeroberfläche wird jedoch nicht aktualisiert, nachdem ein Wert gelöscht wurde. Ich stellte sicher, dass es keine Probleme mit der Rechtschreibung etc ...

Dies ist das Markup ich für meine WPF UI haben:

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

Dies ist der Code, dass ich den Artikel in der löschen nenne HashTable bei Tastendruck:

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; 

     } 

Was mache ich falsch?

Danke,

-Frinny

+0

Nicht verwandt mit Ihrer Frage, aber warum verwenden Sie 'String.Compare()' anstelle von '=='? – svick

+0

Weil ich es gewohnt bin, Dinge zu tun. Ich arbeite hauptsächlich mit VB.NET und habe herausgefunden, dass dies der beste Weg ist, Strings zu vergleichen. – Frinavale

Antwort

5

Der erste Platz für die Bindung Fehler im Ausgabefenster zu sehen, das ganz oft werden Sie in die richtige Richtung weisen. Wenn Sie eine benutzerdefinierte Sammlung erstellen, müssen Sie möglicherweise INotifyCollectionChanged implementieren. Oder überlegen Sie, ob Sie Ihre Datenquelle in ObservableCollection ändern möchten, oder in Ihrem Fall benötigen Sie möglicherweise ObservableDictionary.

auch erwähnt Sie Rechtschreibfehler, es gibt ein paar Möglichkeiten, um sicherzustellen, dass dies kein Problem ist, überprüfen MVVM Foundation ‚s Basis ObservableObject

Ihr Code ein paar Details fehlen, wie Ihre Erklärung für die StaticResource TheHashTable.

Edit: Raising Property gegen eine List-Klasse wird nicht von Änderungen innerhalb dieser Liste mitteilen, wenn Sie die Änderungen an der Benutzeroberfläche in der Liste, um die Liste Typ ändern, um eine neue Eigenschaft ObservableCollection oder zu erstellen:

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

und binden Sie an die Hash-Eigenschaft.

+0

Ich bin nicht an eine benutzerdefinierte Sammlung gebunden. Ich bin an eine benutzerdefinierte HashTable-Klasse gebunden. Die Werte für diese HashTable werden in einer Liste gespeichert .... Ich denke nicht, dass die INotifyCollectionChanged mir in diesem Fall helfen wird, aber ich danke Ihnen für diese Information, weil ich nicht über diese Schnittstelle wusste, bevor Sie es veröffentlichten. Ich habe meinen ursprünglichen Beitrag so geändert, dass er die XAML-Deklaration von TheHashTable enthält. – Frinavale

+0

Ich habe es gerade noch einmal ausgeführt und es gibt keine Fehler im Ausgabefenster. – Frinavale

+0

Ich habe auch meinen ursprünglichen Beitrag aktualisiert, sodass er mehr Implementierung für die benutzerdefinierte HashTable-Klasse zeigt, mit der ich arbeite. – Frinavale

Verwandte Themen