2010-10-24 10 views
7

no estoy seguro de lo que estoy haciendo mal aquí ...WPF interfaz de usuario no actualizados al cambio de propiedad

tengo una tabla hash personalizado que tiene un método que permite a alguien para eliminar un "partNumber" (un valor) desde la HashTable.

El método de eliminación es de la siguiente manera:

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

estoy Encuadernación valores subyacentes de la tabla hash de la interfaz de usuario; sin embargo, la interfaz de usuario no se actualiza después de que se borre un valor. Me aseguré de que no hay problemas con la ortografía, etc ...

Este es el margen de beneficio que tengo para mi WPF UI:

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

Este es el código que estoy llamando para eliminar el elemento en el HashTable al hacer clic en el botón:

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é estoy haciendo mal?

Gracias,

-Frinny

+0

No relacionado con su pregunta, pero ¿por qué está utilizando 'String.Compare()' en lugar de '=='? – svick

+0

Porque esa es la manera en que estoy acostumbrado a hacer las cosas. Principalmente trabajo con VB.NET y he encontrado que esta es la mejor manera de comparar cadenas. – Frinavale

Respuesta

5

El primer lugar para buscar los errores de unión en la ventana de salida, esto a menudo se señalarán en la dirección correcta.

Si está enlazando a una colección personalizada, entonces es posible que necesite implementar INotifyCollectionChanged. O considere cambiar su fuente de datos a ObservableCollection, o en su caso puede necesitar ObservableDictionary.

También se mencionan los errores de ortografía, hay un par de maneras de asegurar que esto no es un problema, echa un vistazo a MVVM Foundation 's ObservableObject base de

Su código está faltando algunos detalles, como su declaración para el StaticResource TheHashTable.

Editar: Raising PropertyChanged contra una clase de lista no se efectuará la notificación de los cambios dentro de esa lista, si necesita la interfaz de usuario para ver los cambios dentro de la lista de cambiar el tipo de lista de ObservableCollection o crear una nueva propiedad:

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

y enlazar a la propiedad Hash.

+0

No estoy vinculado a una colección personalizada. Estoy vinculando a una clase HashTable personalizada. Los valores de este HashTable se almacenan en una lista .... No creo que el INotifyCollectionChanged me ayude en este caso, pero gracias por esta información porque no sabía acerca de esta interfaz antes de publicarla. Modifiqué mi publicación original para contener la declaración XAML de TheHashTable. – Frinavale

+0

Acabo de ejecutarlo de nuevo y no hay errores en la ventana de resultados. – Frinavale

+0

También actualicé mi publicación original para que muestre más implementación para la clase HashTable personalizada con la que estoy trabajando. – Frinavale

Cuestiones relacionadas