在WPF中刷新ListBox的简单方法?

Fen*_*son 6 c# sql wpf listbox refresh

我创建了一个简单的表单,插入/更新/删除Northwind客户的值.一切正常,除了为了看到结果,我必须关闭它,然后重新打开.我的表单看起来像这样:

在此输入图像描述

我已经搜索了数十篇关于如何刷新的文章ListBox,但所有这些都使用了接口实现,或使用DataSet,以及我从未听说过但无法实现的内容.这是一个非常简单的项目,使用简单的程序.是否有一种简单的方法来刷新客户列表而无需添加多行代码?

zez*_*000 12

简单的答案是:"myListBox.Items.Refresh();"

  • 这是问题的答案。 (4认同)

sa_*_*213 7

您是否正在使用ObservableCollection并且您的模型实现INotifyPropertyChanged这两项内容将在任何更改时自动更新ListBox.无需显式刷新列表.

下面是使用的一个小例子ObservableCollectionINotifyPropertyChanged,很明显,你将填充从你的ObservableCollection SQL数据库.

窗口:

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 = "StackOverflow"});
        List.Add(new MyModel { Name = "Adam", CompanyName = "StackOverflow" });
        List.Add(new MyModel { Name = "Chris", CompanyName = "StackOverflow" });
        List.Add(new MyModel { Name = "Steve", CompanyName = "StackOverflow" });
        List.Add(new MyModel { Name = "Brent", CompanyName = "StackOverflow" });
    }

    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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

模型

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"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,对属性的任何编辑都会立即更新列表,也会在添加/删除新项目时更新.

在此输入图像描述


use*_*015 3

调用ListBox.UpdateLayout怎么样?

当然,您还需要更新特定项目,以便它从 ToString 方法返回更新后的字符串。

更新:我认为您还需要在调用 ListBox.UpdateLayout 之前调用 ListBox.InvalidateArrange。