【问题标题】:.Net 4 WPF DataGrid's ItemsSource - works programmatically, but not declaratively.Net 4 WPF DataGrid 的 ItemsSource - 以编程方式工作,但不是以声明方式工作
【发布时间】:2013-01-21 00:04:06
【问题描述】:

我正在使用 C# 并针对 .Net 4.0 编写 WPF 程序。我正在尝试遵循 MVVM 模式,其中我的视图(代码隐藏)具有最少甚至没有代码。

我有一个List<MyRecord>,我想使用DataGrid 在GUI 中显示它。在我的 XAML 中,我有以下内容:

<DataGrid x:Name="RecordGrid" ...>
   <DataGrid.Columns>
      <DataGridTextColumn Binding="{Binding RecId}" Header="Record ID"/>
      <DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
   </DataGrid.Columns>
</DataGrid>

剩下的就是将此网格绑定到数据集合。

当我将它绑定到代码隐藏文件中时,它可以正常工作:

RecordGrid.ItemsSource = MyRecordList;

但是,我更愿意在 XAML 中以声明方式绑定它。所以我尝试了这个:

<DataGrid x:Name="RecordGrid" ItemsSource="{Binding MyRecordList}" ...>

但它默默地不起作用。加载数据网格时没有 XAML 绑定错误消息。我在 MyRecordList 的 get 方法上设置了一个断点,只要 ItemsSource 以声明方式定义,它就不会被调用。

如何让我的数据网格通过 XAML 从MyRecordList 中提取?

【问题讨论】:

  • 你知道你的DataContext是什么吗?
  • @default.kramer,我没有设置或更改我的 DataContext。我的整个测试程序由一个 Application 和 MainWindow 组成。
  • 你应该准备好了thisthis

标签: .net xaml mvvm wpfdatagrid


【解决方案1】:

如果您希望绑定起作用,您需要设置 DataContext... MVVM 模式有一个 View 和一个 ViewModel。 View 是你的 UI - 例如窗口(我们称之为 MainWindow)和您的 ViewModel 是您拥有 RecordGrid 属性和所有其他命令/属性的地方(我们称之为 MainWindowViewModel 类)

您需要将它们都连接起来,这通过在您的视图中指定DataContext 是谁来完成(在我们的例子中是 MainWindowViewModel 类)。

所以你会想在你的视图的构造函数中做这样的事情:

    public MainWindow()
    {
        this.DataContext = new MainWindowViewModel();
        InitializeComponent();

【讨论】:

  • 谢谢。这就是我通常所做的,但在使用 DataGrid 时,为了简单起见,我希望将所有内容都放在一个文件中。我想如果我不在 MainWindow 上设置 DataContext,WPF 将使用 MainWindow 作为默认上下文。好像不是这样的。那么默认的 DataContext 是什么?有吗?
  • 所以如果所有东西都在同一个类中,例如您的属性位于 Window 后面的代码中 - 使用 this.DataContext = this;
  • 如果我不这样做 - 默认是什么?
  • 没有默认值,DataContext是一个对象,因此默认为null。如果不设置 DataContext,绑定将无法工作。
  • 你写了你有一个List&lt;MyRecord&gt; -> 你在哪里声明的?
猜你喜欢
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
相关资源
最近更新 更多