2010-10-24 79 views
7

我不知道我在做什麼錯在這裏...WPF UI在屬性更改

我有,有一個方法,它允許某人刪除「零件號」自定義哈希表(一值)從HashTable。

該刪除方法如下:

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

我哈希表的基礎值結合到UI;但是,在刪除值後,UI不會更新。我確信,有拼寫等沒有任何問題......

這是標記我有我的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> 

這是我打電話給刪除的項目代碼按鈕點擊後的HashTable:

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; 

     } 

我在做什麼錯?

感謝,

-Frinny

+0

與您的問題無關,但您爲什麼使用String.Compare()而不是== ==? – svick 2010-10-24 12:10:38

+0

因爲這是我習慣做事的方式。我主要使用VB.NET,我發現這是比較字符串的最佳方法。 – Frinavale 2010-10-24 18:47:09

回答

5

尋找在輸出窗口綁定錯誤的第一個地方,這往往會指向你在正確的方向。

如果您綁定到自定義集合,那麼您可能需要實現INotifyCollectionChanged。或者考慮將您的數據源更改爲ObservableCollection,或者在您的情況下您可能需要ObservableDictionary

另外你提到的拼寫錯誤,有一對夫婦的方式來確保這不是一個問題,看看MVVM Foundation的基礎ObservableObject

您的代碼缺少一些細節,比如你的宣言爲StaticResource TheHashTable。

編輯: 飼養的PropertyChanged對一個列表類將不通知名單內的變化,如果你需要的用戶界面即可看到該列表中的改變而改變列表類型的ObservableCollection或創建一個新的屬性:

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

並綁定到Hash屬性。

+0

我沒有綁定到自定義集合。我綁定到一個自定義的HashTable類。這個HashTable的值存儲在一個List ....我不認爲INotifyCollectionChanged會幫助我在這種情況下,但感謝您的信息,因爲我不知道這個接口之前,你發佈它。我修改了我原來的帖子以包含TheHashTable的XAML聲明。 – Frinavale 2010-10-24 18:41:39

+0

我只是再次運行它,輸出窗口中沒有錯誤。 – Frinavale 2010-10-24 18:50:17

+0

我也更新了我的原始文章,以便它顯示我正在使用的自定義HashTable類的更多實現。 – Frinavale 2010-10-24 18:50:55