2012-04-19 17 views
13

Tôi có dữ liệu tĩnh mà tôi muốn hiển thị ở định dạng Datagrid. Các giá trị chỉ dành cho mục đích hiển thị và sẽ không thay đổi. Nó có thể được thêm vào như một loại thẻ con của điều khiển Datagrid để tôi có thể tránh bất cứ điều gì trong codebehind không?Dữ liệu tĩnh có thể cho các hàng Datagrid được xác định hoàn toàn trong XAML tức là không có mã phía sau?

Nó phải được điều khiển Datagrid chỉ vì mục đích là thử nghiệm và giới thiệu một số tính năng giao diện người dùng Datagrid nhất định với nội dung dummy blah blah.

Nếu không thể sử dụng nội dung XAML thuần túy thì phương pháp nào tốt nhất (nhanh & bẩn) để thiết lập nội dung giả cho một DataGrid? Nó có thể được thực hiện mà không cần viết các lớp học không?

Trả lời

6

Kiểm tra phần ví dụ về điều này MSDN page

Kể từ DataGrid sử dụng ItemsControl tương tự như ComboBox hoặc ListBox, DataGrid nên cùng một logic. Trong ví dụ đó, về cơ bản chúng tạo ra một tập hợp toàn bộ các đối tượng trong XAML thuần túy.

+1

Tại sao xuống bỏ phiếu? Mọi người, nếu bạn đang downvoting trên một câu trả lời, bạn needto có một decensy ít nhất thêm một nhận xét về "tại sao" – Adarsha

+1

nó là khá rõ ràng rằng đây là một liên kết chỉ trả lời .. – Console

+0

Không, nó không chỉ liên kết .. Nếu tôi chỉ dừng lại sau dòng đầu tiên, thì nó sẽ có! Tôi thực sự giải thích lý do tại sao ví dụ trong bài viết được liên kết sẽ thực sự hữu ích cho OP. Do đó nó được đánh dấu là "Câu trả lời được chấp nhận". Nhưng dù sao.! – Adarsha

15

Bạn có thể làm dữ liệu tĩnh trong XAML, có, nhưng bạn sẽ cần phải tạo một lớp đơn giản cho định dạng bản ghi. Ví dụ, bạn có thể tạo ra tập tin lớp này:

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

Bây giờ trong DataGrid XAML của bạn, bạn có thể làm điều này:

<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

Dưới đây là dữ liệu XAML tinh khiết tĩnh binded vào một 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> 

Kết quả:

enter image description here

Tôi đã không thể autogenerate cột sử dụng XmlDataProvider (tôi có thể bị thiếu một cái gì đó):

<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

Nhưng sử dụng một mã Đằng sau lớp như Dave Đề xuất cho phép AutoBinding để làm việc và trong ý kiến ​​của tôi là đơn giản hơn nhiều (tôi ưa thích cách tiếp cận ResourceDictionary dù):

Code:

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

Cảm ơn bạn đã đề cập điều đó, Guish. Tôi đã làm theo ví dụ đầu tiên của bạn nhưng tôi nhận được lỗi thời gian chạy này: 'Lỗi System.Windows.Data: 50: XmlDataProvider có XML nội tuyến không đặt rõ ràng XmlNamespace của nó (xmlns = "").' Tuy nhiên, dữ liệu xuất hiện trong lưới.Nhưng nếu tôi loại bỏ không gian tên dữ liệu không được chèn vào trong lưới nhưng tôi không nhận được thông báo lỗi. Nếu tôi đặt vào "x" (không có dấu ngoặc kép) thì nó cũng không hoạt động. Làm cách nào để giải quyết vấn đề này? – SezMe

+0

Tôi đã tìm kiếm một chút và tìm thấy liên kết này .... Tôi không biết nếu nó có thể giúp bạn: [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

Ví dụ trong liên kết đó cũng cung cấp cho một lỗi 50. Dựa trên ví dụ đầu tiên trong [link] này (http://stackoverflow.com/questions/24173979/issues-with-data-binding-while-working-with-wpf) Tôi đã cố gắng thêm một XmlNamespaceMappingCollection vào Window.Resources của mình nhưng tôi gặp lỗi message: Kiểu không thực hiện IList: XmlNamespaceMappingCollection. Vì vậy, tôi lại bị mắc kẹt. – SezMe

Các vấn đề liên quan