Datagrid行的静态数据是否可以纯粹在XAML中定义,即后面没有代码?

Gar*_*ett 15 wpf xaml datagrid wpfdatagrid

我有静态数据,我想以Datagrid格式显示.这些值仅用于显示目的,不会更改.它可以作为Datagrid控件的某种子标签添加,以便我可以避免代码隐藏中的任何内容吗?

它必须是Datagrid控件,因为目的是试验和演示某些Datagrid UI功能与虚假blah blah内容.

如果无法获得纯XAML内容,那么为数据网格设置虚拟内容的最佳(快速和脏)方法是什么?可以在没有写课程等的情况下完成吗?

Gui*_*ish 32

这是在数据网格上绑定的纯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>
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

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

<Grid DataContext="{Binding Source={StaticResource MockList}}">
    <DataGrid HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch" 
              ItemsSource="{Binding Mode=Default, XPath=/MockObjects/MockObject}">
    </DataGrid>
</Grid>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是使用像Dave Suggestion这样的类后面的代码允许AutoBinding工作,在我看来更简单(我更喜欢这种ResourceDictionary方法):

码:

namespace WpfStaticDataBinding
{
    public class MockRecord
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)


Dav*_*ger 18

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

namespace TestNamespace
{
    public class MockRecord
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,在您的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>
Run Code Online (Sandbox Code Playgroud)


Ada*_*sha 5

查看此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}"/>
Run Code Online (Sandbox Code Playgroud)

  • 为什么要投反对票?各位,如果您对某个答案投了反对票,您至少需要对“为什么”添加评论 (2认同)
  • 您链接的页面上的示例部分似乎是空的 (2认同)