代码之家  ›  专栏  ›  技术社区  ›  Frinavale

属性更改时未更新WPF UI

  •  7
  • Frinavale  · 技术社区  · 14 年前

    我不知道我在这里做错了什么…

    我有一个自定义哈希表,它有一个方法,允许某人从哈希表中删除“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));
            }
        }
    }
    

    我正在将哈希表的基础值绑定到UI;但是在删除某个值后,不会更新该UI。我确保拼写等方面没有问题…

    这是我的WPF用户界面的标记:

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

    我做错什么了?

    谢谢,

    -弗里尼

    2 回复  |  直到 14 年前
        1
  •  5
  •   benPearce    14 年前

    首先在输出窗口中查找绑定错误,这通常会将您指向正确的方向。

    如果要绑定到自定义集合,则可能需要实现 INotifyCollectionChanged . 或者考虑将数据源更改为ObservableCollection,或者您可能需要 ObservableDictionary

    您还提到了拼写错误,有几种方法可以确保这不是问题,请查看 MVVM Foundation 的基本可观测对象

    您的代码缺少一些细节,例如您对staticresource thehashtable的声明。

    编辑: 对列表类引发PropertyChanged不会通知该列表中的更改,如果您需要UI查看列表中的更改,请将列表类型更改为ObservableCollection或创建新属性:

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

    并绑定到哈希属性。

        2
  •  0
  •   svick Raja Nadar    14 年前

    一种方法是实现 INotifyCollectionChanged 集合上的接口。