2012-12-31 30 views
5

Northwind Customersの値を挿入/更新/削除する簡単なフォームを作成しました。 結果は表示されていない限り、すべて正常に動作し、閉じてからもう一度開く必要があります。私のフォームはこのようになります :簡単にListBoxをWPFでリフレッシュする方法はありますか?

enter image description here

私はListBoxを更新する方法についての記事の数十を検索したが、それらの使用インターフェイスのすべてが実装する、またはデータセットを使用して、と私は聞いたことがないとできませんしているもの実装する。簡単な手順で簡単なプロジェクトです。多くのコード行を追加することなく顧客のリストを更新する簡単な方法はありますか?

+2

あなたのモデルは 'INserifyPropertyChanged'を実装していますか?この2つのことは自動的に' ListBox'を変更します。リストを明示的にリフレッシュする必要はありません。 –

+1

listBoxYourName.Items.Refresh場所(追加/削除)は私のために働いた。コレクションはItemsSourceにバインドされています。奇妙なことに、本当の物語。 – SmartK8

答えて

0

ListBox.UpdateLayoutの呼び出しはどうですか?

もちろん、ToStringメソッドから更新された文字列を返すように、特定のアイテムを更新する必要があります。

UPDATE: ListBox.UpdateLayoutを呼び出す前にListBox.InvalidateArrangeも呼び出す必要があると思います。

+0

どのアイテムを更新する必要がありますか? また、私はそれらの行をどこに置くのですか?挿入/更新/削除メソッドの後に? – Fengson

+0

まだ、何も変わりません../ – Fengson

+0

私はリストボックス自体がリフレッシュオプションを持っていると思います。同じことをするlistbox1.refresh()のように。 – Mullaly

6

ObservableCollectionを使用していますか?あなたのモデルはINotifyPropertyChangedを実装していますか?これらの2つは自動的にリストボックスを更新します。明示的にリストをリフレッシュする必要はありません。

ObservableCollectionINotifyPropertyChangedを使用した小さな例ですが、明らかに、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 = "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> 

この場合、モデル

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

プロパティに任意の編集は、新しいアイテムが追加されたときに更新されます、即座にあなたのリストを更新します/削除されました。

enter image description here

+0

ありがとう、多くの時間を節約:D – Mugiwara

3

簡単な答えは: "myListBox.Items.Refresh();"

関連する問題