死的简单MVVM应用程序的列表框保持为空-我缺少什么

本文关键字:什么 MVVM 简单 应用程序 列表 | 更新日期: 2023-09-27 18:23:49

我的窗口的XAML如下所示:

<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被设置为下面代码背后的构造函数中ViewModel的一个实例:

public partial class MainWindow : Window
{
    private CronjobViewModel cronjobViewModel;
    public MainWindow()
    {
        InitializeComponent();
        this.cronjobViewModel = new CronjobViewModel();
        this.DataContext = cronjobViewModel;
    }
}

ViewModel如下所示:

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"; }
}

我主要在web开发方面经验丰富,对WPF和MVVM的结合很陌生。我花了将近10个小时才弄清楚,但仍然没有找到原因。我还尝试了DataGrid。我看了大约三遍关于MVVM的Jason Dolingers视频的前半部分,并仔细观察了它是如何做到的,但它对我不起作用,尽管我理解MVVM的抽象概念。我敢肯定,我只是无意中遗漏了XAML中应该存在的内容,但篡改显示属性名称和项模板并没有帮助(根据我在互联网上发现的内容,它们甚至没有必要)。有人看到这个代码中的错误吗?

很抱歉代码转储太大,我用更紧凑的方式格式化了"无聊"的部分。

死的简单MVVM应用程序的列表框保持为空-我缺少什么

这是因为Cronjobs是一个字段,不能绑定到字段。尝试将其更改为属性:
public ObservableCollection<Cronjob> Cronjobs { get; set; }

这应该有效;)

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