添加到视图模型的属性不会向组合框生成项目

时间:2015-01-13 17:44:22

标签: c# wpf xaml mvvm data-binding

我的视图模型类非常简单。

class Presenter
{
  public IEnumerable<String> JustFake => new List<String> { "aaa", "bbb" };

  public Presenter() { }
}

在XAML中,我添加了一个绑定到属性的组合框,如下所示。

<Window.DataContext>
  <local:Presenter/>
</Window.DataContext>
...
<ComboBox x:Name="comboBox"
          ItemsSource="{Binding JustFake}"/>

但是,尽管intellisense找到 JustFake ,但这些值不会出现在组合框中。它是空的。我已经尝试过实现 INotify ... 等,但没有什么能给我带来任何不同。我无法真正说出我可以错过的东西。我应该继承其他东西(我看到了blog where they mentioned BindableBase ,无论该类是什么类型的)?我应该以另一种方式介绍 Presenter 吗?

2 个答案:

答案 0 :(得分:1)

public IEnumerable<String> JustFake = new List<String> { "aaa", "bbb" };

声明一个不能绑定的公共字段。您需要属性

public IEnumerable<String> JustFake { get; set;}

public Presenter()
{
    JustFake = new List<String> { "aaa", "bbb" };
}

如果要在构造函数之后设置属性,则需要使用INotifyPropertyChanged,如果要修改集合,请确保使用ObservableCollection而不是{{1} },因为它实现了List

更新:您显然使用的是C#6表达式成员,因此您可以在这方面做得很好。

更新2 :从您报告的例外情况来看,您的INotifyCollectionChanged未设置或稍后设置为DataContext。检查并确保没有任何内容覆盖它。

答案 1 :(得分:0)

绑定到ItemSource上的ItemsControl,例如ListBoxDataGrid需要公共财产:

class Presenter
{
  public List<string> JustFake { get; set; }

  public Presenter() 
  {
     JustFake = new List<string> { "aaa", "bbb" };
  }
}

要支持返回UI的通知,该集合需要INotifyPropertyChanged实现,它通常更容易使用或派生自已实现它的集合类。 ObservableCollection<T>

class Presenter
{
  public ObservableCollection<string> JustFake { get; set; }

  public Presenter() 
  {
     JustFake = new ObservableCollection<string> { "aaa", "bbb" };
  }
}