2012-12-31 7 views
5

Ho creato un semplice modulo che inserisce/aggiorna/elimina un valore per i clienti di Northwind. Tutto funziona bene, tranne che per vedere un risultato, devo chiuderlo e riaprire di nuovo. La mia forma è simile al seguente:FACILE modo per aggiornare ListBox in WPF?

enter image description here

Ho cercato decine di articoli su come aggiornare ListBox, ma tutti coloro che interfaccia l'uso di attuazione, o utilizzando DataSet, e roba non ho mai sentito parlare di e non può strumento. È un progetto molto semplice, che usa semplici procedure. C'è un modo semplice per aggiornare l'elenco dei clienti senza aggiungere molte righe di codice?

+2

Stai usando 'ObservableCollection' e il tuo modello implementa' INotifyPropertyChanged' queste due cose aggiorneranno automaticamente il 'ListBox' su qualsiasi cambiamento.Non è necessario aggiornare esplicitamente l'elenco –

+1

Chiamando listBoxYourName.Items.Refresh() in tutti i i posti (aggiungi/rimuovi) hanno funzionato per me. Anche se la raccolta è associata a ItemsSource. Storia strana ma vera, gente. – SmartK8

risposta

0

Come si chiama ListBox.UpdateLayout?

Ovviamente è inoltre necessario aggiornare gli elementi specifici in modo che restituisca la stringa aggiornata dal metodo ToString.

AGGIORNAMENTO: Penso che sia necessario chiamare ListBox.InvalidateArrange prima di chiamare ListBox.UpdateLayout.

+0

quali articoli devo aggiornare e come? Inoltre, dove metto quelle linee? Dopo i metodi di inserimento/aggiornamento/cancellazione? – Fengson

+0

Ancora, nulla cambia ..:/ – Fengson

+0

Penso che listbox abbia un'opzione di aggiornamento. Come listbox1.refresh(), che fa la stessa cosa. – Mullaly

6

Si sta usando ObservableCollection e il tuo modello implementa INotifyPropertyChanged queste due cose aggiornerà automaticamente il ListBox su qualsiasi cambiamento. non è necessario aggiornare esplicitamente la lista.

Ecco un piccolo esempio di utilizzo di ObservableCollection e INotifyPropertyChanged, ovviamente si popolerà la tua ObservableCollection dal tuo database 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> 

Modello

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

In questo caso qualsiasi modifica alle proprietà aggiornerà l'elenco istantaneamente, anche aggiornerà quando si aggiungono nuovi elementi /rimosso.

enter image description here

+0

Grazie mille, ho risparmiato un sacco di tempo: D – Mugiwara

3

La risposta è semplice: "myListBox.Items.Refresh();"