Как очистить список WPF? - PullRequest
4 голосов
/ 15 июля 2010

Я использую окно списка wpf, я не могу очистить список при вызове функции перезагрузки данных, я просто хочу перезагрузить новые данные во время выполнения, при загрузке страницы он загружает данные правильно, когда я обновляю новые данные извлекается из источника данных, я вижу, что в режиме отладки, но нет новых данных в списке, старые данные остаются в списке, я даже не могу очистить, когда я вызываю list.items.clear (), он генерирует исключение и происходит сбой приложения, я пробовал много способов, есть ли какие-либо проблемы в моей привязке XAML, вот мой код.

<DataTemplate x:Key="listBoxTemplate">
                <StackPanel Margin="3">
                    <DockPanel >
                        <TextBlock FontWeight="Bold" Text="{Binding Name}" DockPanel.Dock="Left" Margin="5,0,10,0"/>
                        <TextBlock Text="  " />
                         <TextBlock Text="{Binding Percnt}" Foreground="Green" FontWeight="Bold" />
                   </DockPanel>                       
                </StackPanel>
            </DataTemplate>

Мой список

 <ListBox Height="898" Name="lstEntity" Width="291" ItemTemplate="{StaticResource listBoxTemplate}" SelectionChanged="lstEntity_SelectionChanged"/>

Связующий код

   lstEntity.ItemsSource = sei.getNames();

Функция getNames () просто возвращает данные в виде списка, ничего особенного в этом нет. Как это решить.

Ответы [ 5 ]

4 голосов
/ 11 августа 2010

Лучший способ получить этот тип поведения - это использовать DependencyProperty и привязки.

В вашем файле класса создайте DP следующим образом:

    #region MyList dependency property
    public static readonly DependencyProperty MyListProperty = DependencyProperty.Register("MyList", typeof(ObservableCollection<String>), typeof(Window1));

    public ObservableCollection<String> MyList
    {
        get { return (ObservableCollection<String>) GetValue(MyListProperty); }
        set { SetValue(MyListProperty, value); }
    }
    #endregion

Затем в вашей привязке XAMLдля этого DP, например, так:

<ListBox ItemSource={Binding Path=MyList, ElementName=MyWindow} Height="898" Name="lstEntity" Width="291" ItemTemplate="{StaticResource listBoxTemplate}" SelectionChanged="lstEntity_SelectionChanged"/>

, где "MyWindow" - это x: имя корневого окна в вашем XAML-файле (вы, конечно, также можете использовать текст данных как шаблон MVVM :)

Тогда, если вы хотите добавить / удалить элементы из своего кода, вы просто получите доступ к списку напрямую:

MyList.Clear();
MyList.Add("My New String");

Вам, конечно, также необходимо изменить общий тип коллекции, чтобы он был вашимсобственный класс ...

1 голос
/ 15 июля 2010

Прежде чем сделать это:

  lstEntity.ItemsSource = sei.getNames();

Очистить список элементов источника:

lstEntity.ItemsSource = "";
1 голос
/ 15 июля 2010

Не могу сказать, что является причиной проблемы в вашем деле, пока вы не предоставите исключение и другие детали.Однако, предлагая лучший способ сделать это.

  1. Пусть ваш метод getnames возвращает IEnumerable.
  2. Создайте из него ObservableCollection.
  3. Установите для ItemsSource созданную коллекцию ObservableCollection

Теперь вы можете изменить свою коллекцию ObservableCollection, чтобы увидеть изменения в ListBox.

1 голос
/ 15 июля 2010

Заполняете ли вы (когда-либо) ListBox, напрямую добавляя его в коллекцию Items или просто через ItemsSource?

Если последнее, установите для ItemsSource значение null и установите его для перезагрузки.

0 голосов
/ 15 июля 2010

Если вы используете шаблон MVVM, добавьте свойство в вашу ViewModel:

public IEnumerable Names {
    get { return sei.getNames() as IEnumerable; }
}

Затем, в вашем XAML, используйте код ItemsSource как:содержимое вашего списка Имен изменяется, вызывайте событие PropertyChanged;это скажет системе WPF обновить ваш ListBox:

PropertyChanged(this, new PropertyChangedEventArgs("Names");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...