2013-07-19 22 views
1

我窗口的XAML看起來是這樣的:ListBox的死簡單MVVM應用程序保持空 - 我錯過了什麼?

<Window x:Class="Binding1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Cronjobs" Height="350" Width="525"> 
    <Grid> 
     <ListBox HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch" ItemsSource="{Binding Cronjobs}" /> 
    </Grid> 
</Window> 

中可見我綁定ListBox的ItemsSource到當前DataContextCronjobs財產。在DataContext在代碼隱藏的構造函數設置爲視圖模型的實例如下:

public partial class MainWindow : Window 
{ 
    private CronjobViewModel cronjobViewModel; 

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

視圖模型看起來是這樣的:

class CronjobViewModel : DependencyObject 
{ 
    public ObservableCollection<Cronjob> Cronjobs; 

    public CronjobViewModel() 
    { 
     this.Cronjobs = new ObservableCollection<Cronjob>(); 
     this.Cronjobs.Add(new Cronjob()); 
     this.Cronjobs.Add(new Cronjob()); 
    } 
} 

爲了快速和簡單的調試我手動添加一些項目到現在的集合。這Cronjob類是實際的模型,它只不過是一類多用一些簡單的字符串屬性,砍倒在重要組成部分:

class Cronjob { 
    private string name; 
    public string Name { get { return this.name; } set { this.name = value; } } 
    public Cronjob() { this.Name = "Herp"; } 
} 

我主要經歷了網絡的發展和新的WPF和MVVM的組合。我花了近10個小時弄清楚了這一點,但仍然沒有看到原因。我也試過DataGrid。我觀看了關於MVVM約0123的前半部分Jason Dolingers Video,並仔細研究了它是如何做到的,但它對我來說不起作用,即使我理解了MVVM的抽象概念。我非常確定我只是無意中忽略了XAML中應該存在的某些內容,但是顯示屬性名稱和項目模板並沒有幫助(根據我在互聯網上發現的內容和它們甚至不需要)。有人在這段代碼中看到錯誤嗎?

對不起,代碼轉儲很大,我用更緊湊的方式格式化了「無聊」的部分。

回答

6

這是因爲Cronjobs是一個字段,你不能綁定到字段。試着將其更改爲屬性:

public ObservableCollection<Cronjob> Cronjobs { get; set; } 
+0

謝謝。我一直在想,爲什麼有時候人們會在類成員後面寫下getter和setter。現在我將閱讀C#中字段和屬性的區別。我想我錯過了那個話題。 –

+0

@Shrooms,這裏是[鏈接](http://msdn.microsoft.com/en-us/library/ms743643.aspx#binding_sources)解釋什麼是有效的綁定源。 – dkozl

+0

謝謝,這對我來說很方便。 –

0

這應該工作;)

public class CronjobViewModel 
    { 
     public ObservableCollection<Cronjob> Cronjobs { get; private set; } 

     public CronjobViewModel() 
     { 
      this.Cronjobs = new ObservableCollection<Cronjob>(); 
      this.Cronjobs.Add(new Cronjob()); 
      this.Cronjobs.Add(new Cronjob()); 
     } 
    } 
相關問題