2011-06-22 15 views
2

私はListBoxと文字列を持つクラスを持っています。ユーザーがアプリケーションの[追加]ボタンをクリックするたびに、クラスの新しいインスタンスを作成し、ListBoxにバインドされたリストに追加します。初めて追加ボタンをクリックすると、リストボックスに最初の項目が表示されますが、次回は2つの項目が表示されません。ListBoxは1つのアイテムのみを表示します

XAML - これはListBoxです:背後

<ListBox Name="ListBox_BinsRegion" Height="181" Margin="233,16,6,94" Width="253" Background="Transparent" BorderThickness="1" BorderBrush="Black" ScrollViewer.VerticalScrollBarVisibility="Auto" ItemsSource="{Binding}"/> 

コード:

List<Class_ListViewItem> List_ListBoxItems = new List<Class_ListViewItem>(); 

private void Button_Add_Click(object sender, RoutedEventArgs e) 
    { 
     Class_ListViewItem item = new Class_ListViewItem(); 
     item.WH = this.comboBox_WareHouseBinsRegionDefinition.SelectedItem.ToString(); 
     item.XXFrom = textBox_XXFrom.Text; 
     item.XXTo = textBox_XXTo.Text; 
     item.YYFrom = textBox_YYFrom.Text; 
     item.YYTo = textBox_YYTO.Text; 
     item.Z = textBox_ZFrom.Text; 

     List_ListBoxItems.Add(item); 

     ListBox_BinsRegion.DataContext = List_ListBoxItems; 
    } 

私のミスですか?

+0

のために行くだろうとは - 場合(List_ListBoxItems.Count == 1) ListBox_BinsRegion.DataContext = List_ListBoxItems。 ListBox_BinsRegion.Items.Refresh(); それは今では... –

+0

あなたが観察可能なコレクションを使用するだけでそれを好むなら、あまりにも機能します。 –

答えて

6

WPFでは、コレクションの変更時期を認識していません。問題はここにある:WPFは、リストボックスを更新できるように

List<Class_ListViewItem> List_ListBoxItems = new List<Class_ListViewItem>(); 

あなたは、

ObservableCollection<Class_ListViewItem> List_ListBoxItems = new ObservableCollection<Class_ListViewItem>(); 

のObservableCollection(System.Collections.ObjectModel)コレクションが変更されたイベントを投げるにリストを変更する必要があります。

また、次の行を削除するか、コントロールのコンストラクタに移動することができます。

ListBox_BinsRegion.DataContext = List_ListBoxItems; 
+1

DataContext行を削除すると、ListBoxには項目がありません。 – CodeNaked

+0

コレクションで発行されたCollectionChangedイベントに基づいてWPFが更新されます。コレクションにINotifyCollectionChangedインターフェイスが実装されていない場合、WPFコレクションは動的に更新されません。 –

+0

今私は問題を参照してください、ありがとうございます –

0

のObservableCollection <>というより一覧<>を使用します。これはあなたが、コントロールのDataContextのを変更する代わりにtheList_ListBoxItemsへの結合を設定し、それ公開するべきではありません(一種の遅くなることがあります)次の行

ListBox_BinsRegion.DataContext = List_ListBoxItems; 
+0

彼はまだListBoxにデータコンテキストを設定する必要があります。それがなければ、コレクションへのアイテムのソースバインディングは機能しません。 –

+1

はい、彼は何かをリストボックスに追加するたびにそれを行う必要はありません。 – MattS423

1

を必要とせず、自動的に結合を更新しますリストの代わりにObservableCollectionまたはBindableCollectionを使用します。

2

2回目にDataContextを割り当てると、技術的に変更されません。これは、同じコレクションに割り当てるためです。あなたの代わりにこのような何かを行う必要があります。

ObservableCollection<Class_ListViewItem> List_ListBoxItems = new ObservableCollection<Class_ListViewItem>(); 

public YourControl() { 
    InitializeComponent(); 
    ListBox_BinsRegion.DataContext = List_ListBoxItems; 
} 

private void Button_Add_Click(object sender, RoutedEventArgs e) 
{ 
    Class_ListViewItem item = new Class_ListViewItem(); 
    item.WH = this.comboBox_WareHouseBinsRegionDefinition.SelectedItem.ToString(); 
    item.XXFrom = textBox_XXFrom.Text; 
    item.XXTo = textBox_XXTo.Text; 
    item.YYFrom = textBox_YYFrom.Text; 
    item.YYTo = textBox_YYTO.Text; 
    item.Z = textBox_ZFrom.Text; 

    List_ListBoxItems.Add(item); 
} 
0

をあなたは(のObservableCollection代わりのリストを使用して)誰もがすでに提案され何もできどちらか - またはあなたがバインドされている依存関係プロパティを照会し、対応するバインディングを見つけることができるし、手動で更新してください。

私はちょうどやったのObservableCollection :)

関連する問題