死的简单 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
绑定到当前 DataContext
的 Cronjobs
属性。 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 应用程序中 ObservableCollection 的 ListBox 中的选定项目
MVVM:将带有 Observable 集合的命令绑定到 Listbox 并从文本框中获取值
WPF MVVM模式,有两个ListBox和一个TxtBox,选任一个ListBox的Item ,就显示在TextBox上。请帮帮高手。。