Datagrid行的静态数据是否可以纯粹在XAML中定义,即不需要使用后台代码?

17

我有静态数据想以Datagrid格式显示。这些值只用于显示目的,不会更改。是否可以将其添加为Datagrid控件的某种子标记,以便我可以避免在代码后台中添加任何内容?

由于目的是使用虚拟占位符内容尝试和演示某些Datagrid UI功能,因此必须使用Datagrid控件。

如果无法使用纯XAML内容,则设置Datagrid虚拟占位符内容的最佳方法是什么(快速而简单)?是否可以在不编写类等内容的情况下完成?

3个回答

35

这里是纯XAML静态数据绑定在数据表格上:

<Window x:Class="WpfStaticDataBinding.XMLWindows"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="XMLWindows" Height="152" Width="294">
<Window.Resources>
    <XmlDataProvider x:Key="MockList"   XPath="/MockObjects/*" >
        <x:XData >
            <MockObjects xmlns="">
                <MockObject  Name="Louis" Type="TTTT" Number="1" />
                <MockObject Name="Joseph" Type="TTTT" Number="2" />
                <MockObject Name="Papineau" Type="ZZZZ" Number="3" />
            </MockObjects>
        </x:XData>
    </XmlDataProvider>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource MockList}}">
    <DataGrid HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch" 
              ItemsSource="{Binding Mode=Default, XPath=/MockObjects/MockObject}" 
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding XPath=@Name}" ></DataGridTextColumn>
            <DataGridTextColumn Header="Type" Binding="{Binding XPath=@Type}"></DataGridTextColumn>
            <DataGridTextColumn Header="Number" Binding="{Binding XPath=@Number}"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

我无法使用XmlDataProvider自动生成列(我可能漏掉了某些东西):

<Grid DataContext="{Binding Source={StaticResource MockList}}">
    <DataGrid HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch" 
              ItemsSource="{Binding Mode=Default, XPath=/MockObjects/MockObject}">
    </DataGrid>
</Grid>

在此输入图片描述

但是使用像Dave Suggestion这样的Code Behind类可以让AutoBinding工作,并且在我看来更简单(尽管我更喜欢ResourceDictionary方法):

代码:

namespace WpfStaticDataBinding
{
    public class MockRecord
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
    }
}
XAML
<Window x:Class="WpfStaticDataBinding.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfStaticDataBinding"
    Title="MainWindow" Height="157" Width="302">
<Window.Resources>
    <ResourceDictionary>
        <x:Array x:Key="MyDumbMockedList" Type="local:MockRecord">
            <local:MockRecord FirstName="Fred" LastName="Flintstone" Email="fred@noemail.org" />
            <local:MockRecord FirstName="Wilma" LastName="Flintstone" Email="wilma@noemail.org" />
            <local:MockRecord FirstName="Barney" LastName="Rubble" Email="barney@noemail.org" />
        </x:Array>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <DataGrid  Margin="10" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
               ItemsSource="{Binding Source={StaticResource MyDumbMockedList}}"/>
</Grid>


谢谢你的分享,Guish。我按照你的第一个示例操作,但是出现了运行时错误:'System.Windows.Data Error: 50 : XmlDataProvider has inline XML that does not explicitly set its XmlNamespace (xmlns="")。' 数据确实显示在网格中。但是如果我删除命名空间,数据就无法插入到网格中,但是我没有收到错误消息。如果我输入"x"(不带引号),它也不起作用。我该如何解决这个难题? - SezMe
我做了一点搜索,找到了这个链接... 我不知道它是否能帮到你:http://blog.wouldbetheologian.com/2009/07/why-wpf-databinding-is-awful-technology.html - Guish
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - SezMe

19
您可以在XAML中使用静态数据,但需要为记录格式创建一个简单的类。例如,您可以创建此类文件:

您可以在XAML中使用静态数据,但是需要为记录格式创建一个简单的类。例如,您可以创建这个类文件:

namespace TestNamespace
{
    public class MockRecord
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
    }
}

现在,在您的XAML DataGrid中,您可以这样做:

<DataGrid xmlns:local="clr-namespace:TestNamespace">

    <DataGrid.Columns>
        <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
        <DataGridTextColumn Header="Rate" Binding="{Binding LastName}" />
        <DataGridTextColumn Header="Cost" Binding="{Binding Email}" />
    </DataGrid.Columns>

     <!-- Static Data which will automatically go in the datagrid -->
     <local:MockRecord FirstName="Fred" LastName="Flintstone" Email="fred@noemail.org" />
     <local:MockRecord FirstName="Wilma" LastName="Flintstone" Email="wilma@noemail.org" />
     <local:MockRecord FirstName="Barney" LastName="Rubble" Email="barney@noemail.org" />
</DataGrid>

1
几乎有相同的解决方案,只是我错过了xmlns:local的部分。它在编译时可以工作,但即使在我的UserControl的定义中存在xmlns:local定义,我也无法在XAML设计器中看到它。非常感谢您的分享。 - Emir

6
请查看MSDN页面中的示例部分。
由于datagrid使用与Combobox或ListBox类似的ItemsControl,所以datagrid应该有相同的逻辑。在这个示例中,他们基本上使用纯XAML创建了一个完整的对象集合。
<XmlDataProvider x:Key="Employees" XPath="/Employees/*">
  <x:XData>
    <Employees xmlns="">
      <Employee Name="Terry Adams" Type="FTE" EmployeeNumber="1" />
      <Employee Name="Claire O&apos;Donnell" Type="FTE" EmployeeNumber="12345" />
      <Employee Name="Palle Peterson" Type="FTE" EmployeeNumber="5678" />
      <Employee Name="Amy E. Alberts" Type="CSG" EmployeeNumber="99222" />
      <Employee Name="Stefan Hesse" Type="Vendor" EmployeeNumber="-" />
    </Employees>
  </x:XData>
</XmlDataProvider>

<DataTemplate x:Key="EmployeeItemTemplate">
  <TextBlock Text="{Binding XPath=@Name}" />
</DataTemplate>


...

<ListBox Name="employeeListBox"
         ItemsSource="{Binding Source={StaticResource Employees}}"
         ItemTemplate="{StaticResource EmployeeItemTemplate}"
         SelectedValue="12345"
         SelectedValuePath="@EmployeeNumber"/>

<TextBlock Text="{Binding ElementName=employeeListBox, 
                  Path=SelectedValue}"/>

1
为什么要踩?如果你对一个回答进行了踩,你至少需要有礼貌地添加一条评论来解释“为什么”。 - Adarsha
不,这不仅仅是一个链接。如果我只在第一行停下来,那就是了!我实际上解释了为什么链接文章中的示例对提问者会有帮助。因此,它被标记为“已接受答案”。但无论如何! - Adarsha
2
您提供的页面示例部分似乎为空。 - John Henckel
这是一个6年前的问题,而MSDN链接指向最新版本,我现在已经将实际示例粘贴在这里了。 - Adarsha

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