死的简单 MVVM 应用程序的 ListBox 保持为空 - 我错过了啥?

Posted

技术标签:

【中文标题】死的简单 MVVM 应用程序的 ListBox 保持为空 - 我错过了啥?【英文标题】:ListBox of dead simple MVVM application stays empty - what am I missing?死的简单 MVVM 应用程序的 ListBox 保持为空 - 我错过了什么? 【发布时间】:2013-07-18 10:28:03 【问题描述】:

我的窗口的 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。我看了Jason Dolingers Video的前半部分关于MVVM的大约三遍,仔细看看它是怎么做的,但它对我不起作用,即使我理解了MVVM的抽象概念。我很确定我只是无意中省略了 XAML 中应该存在的一些东西,但是弄乱显示属性名称和项目模板并没有帮助(根据我在互联网上到处找到的内容,它们甚至没有必要)。有人看到这段代码中的错误吗?

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

【问题讨论】:

【参考方案1】:

这是因为Cronjobs 是一个字段,您不能绑定到字段。尝试将其更改为属性:

public ObservableCollection<Cronjob> Cronjobs  get; set; 

【讨论】:

谢谢。我一直想知道为什么有时人们会在类成员后面写 getter 和 setter。我现在将去阅读 C# 中字段和属性的区别。我想我错过了那个话题。 @Shrooms,这里有一个link 解释什么是有效的绑定源。 谢谢,这对我很方便。【参考方案2】:

这应该有效;)

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

【讨论】:

以上是关于死的简单 MVVM 应用程序的 ListBox 保持为空 - 我错过了啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MVVM 时,绑定不适用于 ListBox

检查绑定到 MVVM 应用程序中 ObservableCollection 的 ListBox 中的选定项目

MVVM:将带有 Observable 集合的命令绑定到 Listbox 并从文本框中获取值

将多选 ListBox 与 MVVM 同步

(MVVM) ListBox Binding

WPF MVVM模式,有两个ListBox和一个TxtBox,选任一个ListBox的Item ,就显示在TextBox上。请帮帮高手。。