2011-06-22 158 views
2

我有一個ListBox和一個帶有字符串的類。每次用戶單擊應用程序中的添加按鈕時,我都會創建該類的新實例並將其添加到綁定到ListBox的列表中。第一次單擊添加按鈕時,列表框顯示第一個項目,但下一次它不顯示兩個項目。列表框僅顯示一個項目

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不知道你的集合何時發生變化。問題就在這裏:

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

您需要將列表更改爲

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

的ObservableCollection(System.Collections.ObjectModel)拋出時集合更改的事件,使WPF可以更新列表框。

此外,您可以刪除以下行,或將其移動到您的控件的構造函數。

ListBox_BinsRegion.DataContext = List_ListBoxItems; 
+1

如果他刪除了DataContext行,那麼ListBox將不會有任何項目。 – CodeNaked

+0

基於在集合上觸發的CollectionChanged事件的WPF更新。如果你的集合沒有實現INotifyCollectionChanged接口,WPF集合將不會動態更新。 –

+0

現在我看到了這個問題,非常感謝你 –

0

使用一個ObservableCollection <>,而不是一個列表<>。這將更新自動綁定,無需以下行(可以是一種緩慢的)

ListBox_BinsRegion.DataContext = List_ListBoxItems; 
+0

他仍然需要在ListBox上設置數據上下文。沒有它的項目源綁定到集合將無法工作。 –

+1

是的,但他不需要在每次向列表框中添加內容時執行此操作。 – MattS423

1

你不應該改變控制的DataContext的,而不是設置綁定到theList_ListBoxItems並使其公開屬性,並使用ObservableCollection或BindableCollection代替列表

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 :)