通过XAML向DataGrid添加行

15

是否可以通过XAML向WPF DataGrid添加一个或多个行,而不将其绑定到集合。我正在寻找的东西本质上是这样的:

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
    ...
    </DataGrid.Columns>

    <DataGrid.Items>
        <DataGridRow>
        ...
        </DataGridRow>
    </DataGrid.Items>
</DataGrid>

我要在设计时使用它,以便查看我的DataGrid列的外观,而不必实际运行代码。

1个回答

25

感觉很幸运,我自己找到了。下面是最简单的方法。

创建一个虚拟类,具有相同的公共属性(重要的是将成员定义为属性而不是字段)。例如:

public class Dummy
{
    public string Subject { get; set; }
    public string Body { get; set; }
    public DateTime DueDateStart { get; set; }       
}

通过在顶部添加以下导入,将您的项目命名空间导入XAML:

xmlns:local="clr-namespace:YourProjectNamespace"

现在您可以像这样在设计时向DataGrid添加项目(行)(确保您的列具有正确的绑定):

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
      <DataGridTextColumn Header="Subject" Binding="{Binding Path=Subject}"/>
      <DataGridTextColumn Header="Body" Binding="{Binding Path=Body}"/>
      <DataGridTextColumn Header="Due Date" Binding="{Binding Path=DueDateStart}"/>
    </DataGrid.Columns>

    <local:Dummy Subject="Subject 1" Body="Body 1" ... />
    <local:Dummy Subject="Subject 2" Body="Body 2" ... />
</DataGrid>

希望这能帮到某些人!

更新

由于这篇文章现在越来越受欢迎,我认为我应该用标准的方式来更新一下。

WPF支持一种称为设计时数据(Design-Time Data)的概念,可以完美地实现此目的。使用设计时数据相对于我上面提到的方法有一些关键优势,包括:

  1. 设计时数据与应用程序功能分开。
  2. 您不需要更改任何内容即可在设计模式和运行模式之间切换控件。
  3. 数据储存在易于编辑的XML文件中。

以下是创建设计时数据文件的步骤:

  1. 在Blend中打开您的项目(免费随VS2015和VS2017提供)。
  2. 打开您的视图(窗口或控件)。
  3. 从Data工具窗口(默认与Solution Explorer停靠),选择从类创建示例数据
  4. 选择您的VM类。您应该选择与您的控件在运行时使用的DataContext相同的类。
  5. Blend将自动为您创建一个包含样本数据的XML文件。文件将类似于:

<local:TestDataList xmlns:local="clr-namespace:YourNamespaceHere" Capacity="46" ID="33" Name="Maecenas curabitur cras">
  <local:TestData ID="66" Name="Aenean vestibulum class"/>
  <local:TestData ID="34" Name="Duis adipiscing nunc praesent"/>
  <local:TestData ID="91" Name="Accumsan bibendum nam"/>
</local:TestDataList>

需要注意的是,您不需要 Blend 来生成此文件。您也可以手动完成此操作。

  • 现在在您的数据网格(或任何您正在使用的控件)中,添加以下属性(根据您的项目更改文件路径):

  • d:DataContext="{d:DesignData Source=SampleData/TestDataListSampleData.xaml}"
    
  • 假设您的控件已经设置好其属性(例如ItemsSourceColumns等),则示例数据将会立即在设计师中显示。
  • 为了完整起见,请注意,Blend不能为泛型类生成自动数据。例如,如果您的VM类包含一个类型为List<string>的属性(或者VM类本身是一个泛型类),那么您将无法在示例数据文件中看到该属性被生成。在这种情况下,您必须创建自己的虚拟类并从泛型类继承,然后将其用作您的属性类型。例如:

    public class MyListOfStrings : List<string>
    { }
    

    这对我不起作用。除此之外,你还做了什么吗?对我来说,它只是为每个新的local:dummy对象显示空行。 - Bhalchandra K
    @Balachandra:请确保您完全按照说明操作;例如,您的“Dummy”类必须是“public”,而且属性必须是公共属性,而不是字段。该解决方案已经为我和其他几个人工作过了,所以很可能您漏掉了某些步骤。 - dotNET
    1
    @Balachandra 如果DataGrid.Columns定义中的属性绑定缺失或不正确,则会出现空行。我已经发布了一个带有示例的答案。 - jmbpiano
    @dotNET 如果您愿意,可以将我的示例代码添加到您自己的答案中,我会删除我的答案,因为它更多的是澄清而不是完整的答案。我本来想将其发布为评论,但格式并不完全适合长代码片段。 - jmbpiano
    @Mr.B:你要么将它们放在DataGrid中,要么绑定“ItemsSource”,两者不可兼得。 - dotNET
    重要提示:一开始它并没有工作,但是我创建了一个新的 Class 文件,然后将自动生成的类置于该类文件的公共状态(并添加了一些需要的属性到该类中)。接着我必须在我的 DataGrid 定义中添加 xmlns:local="clr-namespace:namespace:YourNameSpaceHERE",像这样:<DataGrid xmlns:local="clr-namespace:YourNameSpaceHERE"> ... </DataGrid> - Emir

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接