2012-12-31 35 views
5

Tôi đã tạo một biểu mẫu đơn giản chèn/cập nhật/xóa một giá trị cho Khách hàng Northwind. Mọi thứ hoạt động tốt, ngoại trừ để xem kết quả, tôi phải đóng nó lại và mở lại. dạng của tôi trông như thế này:Cách dễ dàng để làm mới ListBox trong WPF?

enter image description here

Tôi đã tìm kiếm hàng chục bài báo về cách làm mới ListBox, nhưng tất cả những người sử dụng giao diện thực hiện, hoặc sử dụng DataSet, và các công cụ tôi chưa bao giờ nghe nói về và có thể không triển khai thực hiện. Đó là một dự án rất đơn giản, sử dụng các thủ tục đơn giản. Có cách nào dễ dàng để làm mới danh sách khách hàng mà không cần thêm nhiều dòng mã?

+2

Bạn đang sử dụng 'ObservableCollection' và mô hình của bạn thực hiện' INotifyPropertyChanged' hai điều này sẽ tự động cập nhật 'ListBox' trên bất kỳ thay đổi nào. Không cần phải làm mới rõ ràng danh sách –

+1

Gọi listBoxYourName.Items.Refresh() trong tất cả địa điểm (thêm/xóa) làm việc cho tôi. Mặc dù bộ sưu tập bị ràng buộc với ItemsSource. Câu chuyện kỳ ​​lạ nhưng thực sự, mọi người. – SmartK8

Trả lời

0

Làm thế nào về việc gọi ListBox.UpdateLayout?

Tất nhiên bạn cũng cần phải cập nhật (các) mục cụ thể để nó trả về chuỗi được cập nhật từ phương pháp ToString.

CẬP NHẬT: Tôi nghĩ bạn cũng cần gọi ListBox.InvalidateArrange trước khi bạn gọi ListBox.UpdateLayout.

+0

Tôi cần cập nhật các mục nào và làm cách nào? Ngoài ra, tôi đặt những dòng đó ở đâu? Sau khi chèn/Cập nhật/Xóa phương pháp? – Fengson

+0

Tuy nhiên, không có gì thay đổi ..:/ – Fengson

+0

Tôi nghĩ rằng hộp danh sách chính nó có một tùy chọn làm mới. Giống như listbox1.refresh(), cũng giống như vậy. – Mullaly

6

Bạn đang sử dụng ObservableCollection và mô hình của bạn có triển khai INotifyPropertyChanged hai thứ này sẽ tự động cập nhật ListBox trên bất kỳ thay đổi nào không. không cần phải làm mới một cách rõ ràng danh sách.

Dưới đây là một ví dụ nhỏ về việc sử dụng ObservableCollectionINotifyPropertyChanged, rõ ràng là bạn sẽ điền ObservableCollection của mình từ cơ sở dữ liệu SQL.

Window:

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)); 
     } 
    } 
} 

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> 

Mẫu

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")); 
     } 
    } 
} 

Trong trường hợp này bất kỳ chỉnh sửa để tính sẽ cập nhật danh sách của bạn ngay lập tức, cũng sẽ cập nhật khi mục mới được thêm vào/bị xóa.

enter image description here

+0

Cảm ơn bạn rất nhiều, đã tiết kiệm rất nhiều thời gian: D – Mugiwara

3

Câu trả lời đơn giản là: "myListBox.Items.Refresh();"

Các vấn đề liên quan