2010-11-09 115 views
14

我有下面的代碼隱藏:綁定的ObservableCollection到WPF列表框

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     ObservableCollection<int> sampleData = new ObservableCollection<int>(); 
     public ObservableCollection<int> SampleData 
     { 
      get 
      { 
       if (sampleData.Count <= 0) 
       { 
        sampleData.Add(1); 
        sampleData.Add(2); 
        sampleData.Add(3); 
        sampleData.Add(4); 
       } 
       return sampleData; 
      } 
     } 
    } 

我的XAML是:

<Window x:Class="Sandbox.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"> 
    <Grid> 
     <ListBox ItemsSource="{Binding Path=SampleData}"/> 
    </Grid> 
</Window> 

列表不顯示在所有集合中的值(或任何)。有人能指出我的錯誤是什麼嗎?

我是否需要明確設置DataContext?我想如果沒有設置,控件將只使用它自己作爲DataContext。

+0

如果你明確地設置了DataContext,它會工作嗎? – user200783 2010-11-09 21:53:17

回答

20

是的,你需要以某種方式設置DataContext。它沒有DataContext,因爲Window沒有DataContext,除非它被設置。如果在構造函數中這樣做,ListBox將獲得DataContext。

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = this; 
} 

否則,你可以使用的RelativeSource,等的ElementName的結合,但我猜你知道=)

4

我通常在構造函數傳遞一個視圖模型,並設置在DataContext爲傳入的視圖模型。然後,您的ObservableCollection可以移出視圖並放入視圖模型中。這將您的視圖與邏輯分開,並允許您單元測試視圖模型代碼。

public MainWindow(SomeViewModel viewModel) 
{ 
    DataContext = viewModel; 

    InitializeComponent(); 
} 
2

嘗試使用MVVM百通所以在視圖中,可以這樣定義列表框:

<ListBox ItemsSource="{Binding Path=Log, UpdateSourceTrigger=PropertyChanged}"/> 

然後在視圖可以在不背後涉及到綁定的源代碼。在相關的視圖模型添加這樣的事情:

public class ViewModel : ViewModelBase 
{ 
    //... 
    private ObservableCollection<string> p_Log; 

    /// <summary> 
    /// A log of a starting process 
    /// </summary> 
    public ObservableCollection<string> Log 
    { 
     get { return p_Log; } 

     set 
     { 
      base.RaisePropertyChangingEvent("Log"); 
      p_Log.Add(value.ToString()); 
      base.RaisePropertyChangedEvent("Log"); 
     } 
    } 
    //.... 
    /// <summary> 
    /// Initializes this view model. 
    /// </summary> 
    /// <param name="mainWindowViewModel">The view model for this application's main window.</param> 
    private void Initialize(MainWindowViewModel mainWindowViewModel) 
    { 
     //... 
     p_Log = new ObservableCollection<string>(); 
    } 

,然後在ViewModelBase定義的事件將繼續在查看更新的結合,而不需要任何視圖中的一個新的字符串添加到任何時候落後碼可觀察的集合p_log。

相關問題