是否可以通过XAML将一行或多行添加到WPF DataGrid,而不将其绑定到集合。我要找的基本上是这样的东西:
<DataGrid AutoGenerateColumns="False">
<DataGrid.Columns>
...
</DataGrid.Columns>
<DataGrid.Items>
<DataGridRow>
...
</DataGridRow>
</DataGrid.Items>
</DataGrid>
我将在设计时使用它,看看我的DataGrid列在不实际运行代码的情况下会是什么样子。
感到幸运。我自己找到的。这是最简单的方法。
创建一个具有相同公共属性的伪类(重要的是将成员定义为属性而不是字段)。例如:
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支持一个称为"设计时数据"的概念,它正是为了达到这个目的。与我上面提到的方法相比,使用设计时数据的一些关键优势包括:
- 设计时数据与应用程序功能保持分离
- 您根本不需要更改任何内容来在设计模式和运行模式之间切换控件
- 数据存在于易于编辑的XML文件中
以下是创建设计时数据文件的步骤:
- 在Blend中打开您的项目(VS2015和VS2017免费提供)
- 打开您的视图(正在使用的窗口或控件)
- 从数据工具窗口(默认情况下与解决方案资源管理器对接)中,选择从类创建示例数据
- 选择您的VM类。您应该选择控件在运行时实际使用的类作为其
DataContext
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来生成此文件。你也可以用手做
现在,在您的DataGrid(或您正在使用的任何控件)中,添加以下属性(根据您的项目更改文件路径):
d:DataContext="{d:DesignData Source=SampleData/TestDataListSampleData.xaml}"
- 假设控件的属性设置正确(例如
ItemsSource
、Columns
等),则示例数据将立即开始显示在设计器中
请注意,Blend不能为泛型类生成自动数据。例如,如果VM类包含类型为List<string>
的属性(或者VM类本身是泛型类),则不会在示例数据文件中看到生成该属性。在这种情况下,您必须创建自己的从泛型类继承的伪类,然后将其用作属性的类型。例如:
public class MyListOfStrings : List<string>
{ }