2010-10-24 33 views
7

Tôi không chắc mình đang làm gì sai ở đây ...Giao diện người dùng WPF không được cập nhật khi thay đổi thuộc tính

Tôi có một HashTable tùy chỉnh có phương pháp cho phép ai đó xóa "partNumber" (giá trị) từ HashTable.

Phương pháp xóa như sau:

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

Tôi ràng buộc giá trị cơ bản của Hashtable để giao diện người dùng; tuy nhiên giao diện người dùng không được cập nhật sau khi giá trị bị xóa. Tôi chắc chắn rằng không có vấn đề với chính tả vv ...

Đây là đánh dấu tôi đã cho UI WPF của tôi:

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

Đây là mã mà tôi đang kêu gọi để xóa các mục trong HashTable khi nhấp vào nút:

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; 

     } 

Tôi đang làm gì sai?

Cảm ơn,

-Frinny

+0

Không liên quan đến câu hỏi của bạn, nhưng tại sao bạn sử dụng 'String.Compare()' thay vì '=='? – svick

+0

Vì đó là cách tôi thường làm. Tôi chủ yếu làm việc với VB.NET và tôi đã tìm thấy đây là cách tốt nhất để so sánh các chuỗi. – Frinavale

Trả lời

5

Nơi đầu tiên để tìm kiếm ràng buộc lỗi trong cửa sổ Output, điều này khá thường xuyên sẽ chỉ cho bạn đi đúng hướng.

Nếu bạn đang ràng buộc với bộ sưu tập tùy chỉnh thì bạn có thể cần triển khai INotifyCollectionChanged. Hoặc xem xét việc thay đổi nguồn dữ liệu của bạn thành ObservableCollection hoặc trong trường hợp của bạn, bạn có thể cần ObservableDictionary.

Ngoài ra bạn đề cập đến lỗi chính tả, có một vài cách để đảm bảo rằng đây không phải là một vấn đề, hãy kiểm tra MVVM Foundation 's cơ sở ObservableObject

Mã của bạn thiếu một vài chi tiết, như tuyên bố của bạn cho StaticResource TheHashTable.

Edit: Nâng PropertyChanged chống lại một lớp Danh sách sẽ không thông báo những thay đổi trong Danh sách đó, nếu bạn cần giao diện người dùng để xem những thay đổi trong danh sách thay đổi kiểu danh sách để ObservableCollection hoặc tạo một tài sản mới:

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

và liên kết với thuộc tính Hash.

+0

Tôi không ràng buộc với một bộ sưu tập tùy chỉnh. Tôi đang ràng buộc với một lớp HashTable tùy chỉnh. Các giá trị cho HashTable này được lưu trữ trong Danh sách .... Tôi không nghĩ rằng INotifyCollectionChanged sẽ giúp tôi trong trường hợp này nhưng cảm ơn bạn vì thông tin này vì tôi không biết về giao diện này trước khi bạn đăng nó. Tôi đã sửa đổi bài viết gốc của mình để chứa khai báo XAML của TheHashTable. – Frinavale

+0

Tôi chỉ chạy nó một lần nữa và không có lỗi trong cửa sổ Output. – Frinavale

+0

Tôi cũng đã cập nhật bài đăng gốc của mình để nó hiển thị nhiều triển khai hơn cho lớp HashTable tùy chỉnh mà tôi đang làm việc. – Frinavale

Các vấn đề liên quan