Пользовательский интерфейс WPF не обновляется при изменении свойства - PullRequest
7 голосов
/ 24 октября 2010

Я не уверен, что я делаю здесь не так ...

У меня есть пользовательский HashTable, у которого есть метод, который позволяет кому-то удалить «partNumber» (значение) из 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));
        }
    }
}

Я связываю базовые значения HashTable с пользовательским интерфейсом; однако пользовательский интерфейс не обновляется после удаления значения. Я удостоверился, что нет проблем с правописанием и т.д ...

У меня есть разметка для моего интерфейса 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>

Это код, по которому я звоню, чтобы удалить элемент из 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

Ответы [ 2 ]

5 голосов
/ 24 октября 2010

Первое место, где нужно искать ошибки привязки в окне «Вывод», это довольно часто указывает вам правильное направление.

Если вы привязываетесь к пользовательской коллекции, вам может потребоваться реализовать INotifyCollectionChanged .Или подумайте об изменении источника данных на ObservableCollection, или в вашем случае вам может понадобиться ObservableDictionary .

Также вы упомянули орфографические ошибки, есть несколько способов убедиться, что это не проблема, проверьте MVVM Foundation base ObservableObject

В вашем коде отсутствуют некоторые детали, например, ваше объявление для StaticResource TheHashTable.

Редактировать: Повышение PropertyChanged противКласс List не будет уведомлять об изменениях в этом списке, если вам нужен пользовательский интерфейс для просмотра изменений в списке, измените тип списка на ObservableCollection или создайте новое свойство:

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

и привяжите его к свойству Hash.

0 голосов
/ 24 октября 2010

Один из способов сделать это - реализовать интерфейс INotifyCollectionChanged в вашей коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...