p13n
p13n

Reputation: 1004

ListBox of dead simple MVVM application stays empty - what am I missing?

The XAML of my window looks like this:

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

As visible I bind the ListBox's ItemsSource to the Cronjobs property of the current DataContext. The DataContext is set to an instance of the ViewModel below in the constructor of the code-behind:

public partial class MainWindow : Window
{
    private CronjobViewModel cronjobViewModel;

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

The ViewModel looks like this:

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

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

For quick and simple debugging I manually add some items to the collection for now. That Cronjob class is the actual model which is nothing more than a class with some simple string properties, cut down to the essential part:

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

I am mainly experienced in web development and new to the combination of WPF and MVVM. I spent nearly 10 hours figuring this out now but still do not see the cause. I also tried the DataGrid. I watched the first half of Jason Dolingers Video about MVVM about three times and took a close look on how did it, but it does not work for me, even though I understood the abstract concept of MVVM. I am pretty sure I just unintendedly omitted something in the XAML which should be there, but messing around with display property names and item templates did not help (according to what I found here and there around the internet they are not even necessary). Does anybody see the error in this code?

Sorry for the large code dump, I formatted the "boring" parts in a more compact way.

Upvotes: 1

Views: 199

Answers (2)

Jan Peter
Jan Peter

Reputation: 920

This should work ;)

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

Upvotes: 0

dkozl
dkozl

Reputation: 33364

It's because Cronjobs is a field and you cannot bind to fields. Try changing it into property:

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

Upvotes: 6

Related Questions