Подтвердить что ты не робот

Могут ли статические данные для строк Datagrid быть определены исключительно в XAML, т.е. нет кода?

У меня есть статические данные, которые я хочу отобразить в формате Datagrid. Значения предназначены только для отображения и не будут меняться. Может ли он быть добавлен как какой-то subtag элемента управления Datagrid, поэтому я могу избежать чего-либо в коде?

Он должен быть контролем Datagrid только в том случае, если целью является экспериментировать с некоторыми функциями Datagrid UI с использованием фиктивного бла-бла-контента.

Если чистый контент XAML невозможен, то какой лучший (быстрый и грязный) способ установить фиктивный контент для datagrid? Можно ли это сделать без написания классов и т.д.?

4b9b3361

Ответ 1

Проверьте раздел примера на этой странице MSDN

Так как datagrid использует ItemsControl, аналогичный Combobox или ListBox, datagrid должен быть такой же логикой. В этом примере они в основном создают целую коллекцию объектов в чистом XAML.

Ответ 2

Вот чистые статические данные XAML, привязанные к datagrid:

<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 [email protected]}" ></DataGridTextColumn>
            <DataGridTextColumn Header="Type" Binding="{Binding [email protected]}"></DataGridTextColumn>
            <DataGridTextColumn Header="Number" Binding="{Binding [email protected]}"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Результат:

enter image description here

Мне не удалось автогенерировать столбцы с помощью XmlDataProvider (возможно, что-то не хватает):

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

enter image description here

Но использование кода За классом, например, Dave Suggestion, позволяет 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="[email protected]" />
            <local:MockRecord FirstName="Wilma" LastName="Flintstone" Email="[email protected]" />
            <local:MockRecord FirstName="Barney" LastName="Rubble" Email="[email protected]" />
        </x:Array>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <DataGrid  Margin="10" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
               ItemsSource="{Binding Source={StaticResource MyDumbMockedList}}"/>
</Grid>

Ответ 3

Вы можете делать статические данные в 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="[email protected]" />
     <local:MockRecord FirstName="Wilma" LastName="Flintstone" Email="[email protected]" />
     <local:MockRecord FirstName="Barney" LastName="Rubble" Email="[email protected]" />
</DataGrid>