簡體   English   中英

如何清除WPF列表框?

[英]How to clear WPF listbox?

Hai正在使用wpf列表框,調用重載數據功能時無法清除列表,我只想在運行時重載新數據,而頁面加載時它會正確加載數據,刷新時會提取新數據itemsource我可以在調試模式下看到它,但是列表框中沒有新數據,舊數據仍保留在列表中,我什至無法清除,當我調用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()函數僅將數據作為列表返回,其中沒有任何特殊代碼,如何解決此問題。

獲得這種行為的最好方法是使用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”是XAML文件中根窗口的x:Name(當然,您也可以使用數據上下文,例如MVVM模式:)

然后,如果要從代碼中添加/刪除項目,只需直接訪問列表:

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

當然,您還需要將集合的通用類型更改為您自己的類...

您是否曾經通過直接添加到Items集合或僅通過ItemsSource填充ListBox?

如果是后者,則將ItemsSource設置為null並將其設置為重新加載。

在您提供例外情況和其他詳細信息之前,您無法說出您的案子是什么原因。 但是建議做某事的更好方法。

  1. 讓您的getnames方法返回IEnumerable。
  2. 從中構造一個ObservableCollection。
  3. 將ItemsSource設置為創建的ObservableCollection

現在,您可以更改ObservableCollection,以查看ListBox中的更改。

在您這樣做之前:

  lstEntity.ItemsSource = sei.getNames();

清除列表框itemssource:

lstEntity.ItemsSource = "";

如果使用的是MVVM模式,請向ViewModel中添加一個屬性:

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

然后,在您的XAML中,將ItemsSource編寫為:

<ListBox ... ItemsSource="{Binding Names}" ... />

每當“名稱”列表的內容發生更改時,都將引發PropertyChanged事件; 這將告訴WPF系統刷新您的ListBox:

PropertyChanged(this, new PropertyChangedEventArgs("Names");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM