2012-04-19 8 views
13

Mam dane statyczne, które chcę wyświetlić w formacie Datagrid. Wartości służą wyłącznie do wyświetlania i nie ulegną zmianie. Czy można go dodać jako pewnego rodzaju podznacznik formantu DataGrid, aby uniknąć czegokolwiek w kodzie?Czy dane statyczne wierszy Datagrid mogą być zdefiniowane wyłącznie w XAML, tzn. Czy nie ma kodu?

To musi być DataGrid kontroli jedynie jako celem jest eksperyment z demo i pewne cechy DataGrid UI z manekina zawartości bla bla.

Jeśli czysta zawartość XAML nie jest możliwa, to jaka jest najlepsza (szybka & brudna) metoda ustawiania fałszywej treści dla datagridu? Czy można to zrobić bez pisania zajęć itp.?

Odpowiedz

6

Sprawdź sekcja przykładem na to MSDN page

Od datagrid wykorzystuje ItemsControl podobny do ComboBox lub ListBox, DataGrid powinna być taka sama logika. W tym przykładzie zasadniczo tworzą całą kolekcję obiektów w czystym XAML.

+1

Dlaczego dół głos? Ludzie, jeśli downvoting na odpowiedź, ty needto mają decensy przynajmniej dodawania komentarza na temat „dlaczego” – Adarsha

+1

to jest dość oczywiste, że to jest tylko odpowiedź linku .. – Console

+0

Nie, to nie jest tylko link. Jeśli zatrzymałbym się po pierwszej linii, byłaby to! Tak naprawdę wyjaśniłem, dlaczego przykład w połączonym artykule będzie rzeczywiście pomocny dla PO. Dlatego jest oznaczony jako "Zaakceptowana odpowiedź". Ale w każdym razie.! – Adarsha

15

Możesz wykonywać statyczne dane w XAML, tak, ale musisz utworzyć prostą klasę dla formatu rekordu. Na przykład, można utworzyć ten plik Klasa:

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

Teraz w XAML DataGrid można to zrobić:

<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> 
27

Tutaj jest czysty XAML dane statyczne zbindowanych na 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> 

Wynik:

enter image description here

I nie był w stanie autogenerować kolumn za pomocą XmlDataProvider (ja chyba czegoś brakuje):

<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

ale przy użyciu kodu Behind klasy jak Dave Sugestia pozwalają autobindingu do pracy iw moim zdaniem jest dużo prostsze (wolałem podejście ResourceDictionary choć):

Kod:

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> 

+0

Dzięki za podanie tego, Guish. Poszedłem za pierwszym przykładem, ale otrzymałem ten błąd czasu wykonywania: "System.Windows.Data Error: 50: XmlDataProvider ma wbudowany kod XML, który nie określa jawnie jego XmlNamespace (xmlns =" ​​")." Dane pojawiają się jednak w sieci.Ale jeśli usunę przestrzeń nazw, dane nie zostaną wstawione do siatki, ale nie otrzymam komunikatu o błędzie. Jeśli wstawię "x" (bez cudzysłowów), to również nie działa. Jak obejść tę zagadkę? – SezMe

+0

Zrobiłem małe wyszukiwanie i znalazłem ten link .... Nie wiem, czy to może ci pomóc: [http://blog.wouldbetheologian.com/2009/07/why-wpf-databinding-is-awful- technology.html] (http://blog.wouldbetheologian.com/2009/07/why-wpf-databinding-is-awful-technology.html) – Guish

+0

Przykład w tym linku również daje błąd 50. Na podstawie pierwszego przykładu w tym [link] (http://stackoverflow.com/questions/24173979/issues-with-data-binding-while-working-w-wpf) Próbowałem dodać XmlNamespaceMappingCollection do mojego Window.Resources, ale pojawia się błąd message: Typ nie implementuje IList: XmlNamespaceMappingCollection. Więc znowu utknąłem. – SezMe

Powiązane problemy