在 WPF 中刷新 ListBox 的简单方法?
Posted
技术标签:
【中文标题】在 WPF 中刷新 ListBox 的简单方法?【英文标题】:EASY way to refresh ListBox in WPF? 【发布时间】:2012-12-15 07:21:59 【问题描述】:我创建了一个简单的表单,用于插入/更新/删除 Northwind 客户的值。 一切正常,除了为了看到结果,我必须关闭它,然后重新打开。 我的表格如下所示:
我已经搜索了几十篇关于如何刷新ListBox
的文章,但是所有这些都使用接口实现,或者使用DataSets,以及我从未听说过并且无法实现的东西。这是一个非常简单的项目,使用简单的程序。有没有不用多行代码就能刷新客户列表的简单方法?
【问题讨论】:
你在使用ObservableCollection
吗?你的模型是否实现了INotifyPropertyChanged
,这两个东西会在任何变化时自动更新ListBox
。不需要显式刷新列表
在所有地方(添加/删除)调用 listBoxYourName.Items.Refresh() 对我有用。即使集合绑定到 ItemsSource。奇怪但真实的故事,伙计们。
【参考方案1】:
简单的答案是:myListBox.Items.Refresh();
【讨论】:
这是问题的答案。【参考方案2】:您是否使用ObservableCollection
并且您的模型是否实现INotifyPropertyChanged
这两件事将在任何更改时自动更新列表框。无需显式刷新列表。
这是一个使用ObservableCollection
和INotifyPropertyChanged
的小例子,显然您将从SQL
数据库中填充ObservableCollection。
窗口:
public partial class MainWindow : Window, INotifyPropertyChanged
private ObservableCollection<MyModel> _list = new ObservableCollection<MyModel>();
private MyModel _selectedModel;
public MainWindow()
InitializeComponent();
List.Add(new MyModel Name = "James", CompanyName = "***");
List.Add(new MyModel Name = "Adam", CompanyName = "***" );
List.Add(new MyModel Name = "Chris", CompanyName = "***" );
List.Add(new MyModel Name = "Steve", CompanyName = "***" );
List.Add(new MyModel Name = "Brent", CompanyName = "***" );
public ObservableCollection<MyModel> List
get return _list;
set _list = value;
public MyModel SelectedModel
get return _selectedModel;
set _selectedModel = value; NotifyPropertyChanged("SelectedModel");
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string property)
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
Xaml
<Window x:Class="WpfApplication11.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Name="UI">
<Grid>
<ListBox ItemsSource="Binding ElementName=UI, Path=List" SelectedItem="Binding ElementName=UI, Path=SelectedModel" Margin="0,0,200,0" DisplayMemberPath="DisplayMember" SelectedIndex="0" />
<StackPanel HorizontalAlignment="Left" Height="100" Margin="322,10,0,0" VerticalAlignment="Top" Width="185">
<TextBlock Text="Name" />
<TextBox Height="23" TextWrapping="Wrap" Text="Binding ElementName=UI, Path=SelectedModel.Name, UpdateSourceTrigger=PropertyChanged" />
<TextBlock Text="Company Name" />
<TextBox Height="23" TextWrapping="Wrap" Text="Binding ElementName=UI, Path=SelectedModel.CompanyName, UpdateSourceTrigger=PropertyChanged" />
</StackPanel>
</Grid>
</Window>
型号
public class MyModel : INotifyPropertyChanged
private string _name;
private string _companyName;
public string Name
get return _name;
set _name = value; NotifyPropertyChanged("Name");
public string CompanyName
get return _companyName;
set _companyName = value; NotifyPropertyChanged("CompanyName");
public string DisplayMember
get return string.Format("0 (1)", Name, CompanyName);
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string property)
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
PropertyChanged(this, new PropertyChangedEventArgs("DisplayMember"));
在这种情况下,对属性的任何编辑都会立即更新您的列表,也会在添加/删除新项目时更新。
【讨论】:
非常感谢,节省了很多时间:D【参考方案3】:调用 ListBox.UpdateLayout 怎么样?
当然,您还需要更新特定项目,以便它从 ToString 方法返回更新后的字符串。
更新:我认为您还需要在调用 ListBox.UpdateLayout 之前调用 ListBox.InvalidateArrange。
【讨论】:
我需要更新哪些项目以及如何更新?另外,我把这些线放在哪里?在插入/更新/删除方法之后? 仍然,没有任何变化.. :/ 我认为列表框本身有一个刷新选项。就像 listbox1.refresh(),它做同样的事情。 我的意思是您之前添加到列表框中的项目,可能是覆盖 Object.ToString 的对象,不是吗? 您也可以尝试清除列表框并再次从数据库中重新绘制。【参考方案4】:使用 INotifyPropertyChanged 是最好的方法,刷新整个列表不是一个好主意。 正门:
public partial class MainWindow : Window
private BindingList<FoodModel> foodList = new BindingList<FoodModel>();
public MainWindow()
InitializeComponent();
private void Button1_Click(object sender, RoutedEventArgs e)
foodList.Add(new FoodModel foodName = "apple1" );
foodList.Add(new FoodModel foodName = "apple2" );
foodList.Add(new FoodModel foodName = "apple3" );
FoodListBox.ItemsSource = foodList;
private void Button2_Click(object sender, RoutedEventArgs e)
foodList[0].foodName = "orange";
private void RefreshButton_Click(object sender, RoutedEventArgs e)
FoodListBox.Items.Refresh();
型号:
public class FoodModel: INotifyPropertyChanged
private string _foodName;
public string foodName
get return _foodName;
set
if (_foodName != value)
_foodName = value;
PropertyChanged(this, new PropertyChangedEventArgs("foodName"));
public event PropertyChangedEventHandler PropertyChanged = delegate ;
XAML:
<ListBox HorizontalAlignment="Center" Name="FoodListBox" VerticalAlignment="Top" Width="194" Height="150">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Binding foodName" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
【讨论】:
以上是关于在 WPF 中刷新 ListBox 的简单方法?的主要内容,如果未能解决你的问题,请参考以下文章