WPF UI未在属性更改时更新

7

我不确定我在这里做错了什么...

我有一个自定义的哈希表,其中有一种方法可以允许某人从哈希表中删除“partNumber”(一个值)。

删除方法如下:

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

我正在将HashTable的底层值绑定到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>

这是我在按钮点击时调用以删除哈希表中项目的代码:
  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

与您的问题无关,但为什么要使用String.Compare()而不是== - svick
因为这是我习惯的方式。我主要使用VB.NET,我发现这是比较字符串的最佳方式。 - Frinavale
2个回答

5
在输出窗口中查找绑定错误是第一步,这通常会指向正确的方向。
如果您要绑定到自定义集合,则可能需要实现INotifyCollectionChanged。或考虑将数据源更改为ObservableCollection,或者在您的情况下,您可能需要ObservableDictionary
此外,您提到了拼写错误,有几种方法可以确保这不是问题,请查看MVVM Foundation的基本ObservableObject。
您的代码缺少一些细节,例如声明StaticResource TheHashTable的方式。
编辑: 针对List类引发PropertyChanged不会通知该List中的更改,如果需要UI查看列表中的更改,则将列表类型更改为ObservableCollection或创建新属性。
public ObservableCollection Hash
{
  get
  {
    return new ObservableCollection(this.HashList);
  }
}

并绑定到 Hash 属性。

我没有绑定到自定义集合,而是绑定到自定义的HashTable类。这个HashTable的值存储在List<int>中...我不认为INotifyCollectionChanged会在这种情况下对我有帮助,但感谢您提供了这个信息,因为在您发布之前我不知道这个接口。我已经修改了原始帖子,包含TheHashTable的XAML声明。 - Frinavale
我刚刚再次运行了它,输出窗口中没有错误。 - Frinavale
我还更新了原帖,展示了我正在处理的自定义HashTable类的更多实现。 - Frinavale

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接