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

Property added to view model doesn't produce items to a combo box

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

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

  public Presenter() { }
}

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

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

然而,尽管智能感知发现 JustFake,但组合框中没有显示这些值。它是空的。我试过实施 INotify... 等,但没有任何区别。我真的不知道我会错过什么。我应该继承其他东西吗(我看到 blog where they mentioned BindableBase,无论 class 可能是什么)?我应该用另一种方式介绍 Presenter 吗?

绑定到 ItemsControl 上的 ItemSource,例如 ListBoxDataGrid 需要 public 属性:

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

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

为了支持返回 UI 的通知,该集合需要一个 INotifyPropertyChanged 实现,通常更容易使用或从已经实现它的集合 class 派生。 ObservableCollection<T>:

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

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

声明一个public 字段,它不能被绑定。你需要一个 属性:

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

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

如果要在构造函数后设置属性,则需要使用INotifyPropertyChanged,如果要修改集合,请务必使用ObservableCollection而不是 List,因为它实现了 INotifyCollectionChanged.

更新:您显然使用了 C# 6 表达式成员,所以您在这方面可能没问题。

更新 2:从您报告的异常来看,您的 DataContext 似乎未设置,或者稍后设置为 this。检查并确保没有任何东西覆盖它。