原創(chuàng)|使用教程|編輯:龔雪|2025-09-05 11:07:25.470|閱讀 24 次
概述:本文主要介紹DevExpress WPF Grid控件如何將數據綁定虛擬數據源,歡迎下載最新版組件體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
DevExpress WPF擁有120+個控件和庫,將幫助您交付滿足甚至超出企業(yè)需求的高性能業(yè)務應用程序。通過DevExpress WPF能創(chuàng)建有著強大互動功能的XAML基礎應用程序,這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件的衍伸產品,還是以數據為中心的商業(yè)智能產品,都能通過DevExpress WPF控件來實現。
本文演示如何使用InfiniteAsyncSource或PagedAsyncSource虛擬源將GridControl綁定到數據源。,歡迎下載最新版組件體驗!
DevExpress技術交流群11:749942875 歡迎一起進群討論
在本教程中,將IssuesContext 后代用作示例數據源。
TIP:DevExpress虛擬源支持Entity Framework、Entity Framework Core和XPO源。
安裝EntityFramework NuGet包。
將以下代碼添加到應用程序中。
示例數據
Issue.cs
using System.Collections.Generic; public class Issue { public int Id { get; set; } public string Subject { get; set; } public int UserId { get; set; } public virtual User User { get; set; } public DateTime Created { get; set; } public int Votes { get; set; } public Priority Priority { get; set; } public Issue() { Created = DateTime.Now; } } public enum Priority { Low, BelowNormal, Normal, AboveNormal, High } public class User { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public virtual ICollection<Issue> Issues { get; set; } }
Issue.vb
Imports System.Collections.Generic Public Class Issue Public Property Id As Integer Public Property Subject As String Public Property UserId As Integer Public Overridable Property User As User Public Property Created As Date Public Property Votes As Integer Public Property Priority As Priority Public Sub New() Created = Date.Now End Sub End Class Public Enum Priority Low BelowNormal Normal AboveNormal High End Enum Public Class User Public Property Id As Integer Public Property FirstName As String Public Property LastName As String Public Overridable Property Issues As ICollection(Of Issue) End Class
IssuesContextInitializer.cs
using System; using System.Data.Entity; using System.Linq; public class IssuesContextInitializer : DropCreateDatabaseIfModelChanges<IssuesContext> { public static void ResetData() { using(var context = new IssuesContext()) { context.Users.Load(); context.Users.RemoveRange(context.Users); context.SaveChanges(); CreateData(context); } } protected override void Seed(IssuesContext context) { base.Seed(context); CreateData(context); } static void CreateData(IssuesContext context) { var users = OutlookDataGenerator.Users .Select(x => { var split = x.Split(' '); return new User() { FirstName = split[0], LastName = split[1] }; }) .ToArray(); context.Users.AddRange(users); context.SaveChanges(); var rnd = new Random(0); var issues = Enumerable.Range(0, 1000) .Select(i => new Issue() { Subject = OutlookDataGenerator.GetSubject(), UserId = users[rnd.Next(users.Length)].Id, Created = DateTime.Today.AddDays(-rnd.Next(30)), Priority = OutlookDataGenerator.GetPriority(), Votes = rnd.Next(100), }) .ToArray(); context.Issues.AddRange(issues); context.SaveChanges(); } }
IssuesContextInitializer.vb
Imports System Imports System.Data.Entity Imports System.Linq Public Class IssuesContextInitializer Inherits DropCreateDatabaseIfModelChanges(Of IssuesContext) ': DropCreateDatabaseAlways<IssuesContext> { Public Shared Sub ResetData() Using context = New IssuesContext() context.Users.Load() context.Users.RemoveRange(context.Users) context.SaveChanges() CreateData(context) End Using End Sub Protected Overrides Sub Seed(ByVal context As IssuesContext) MyBase.Seed(context) CreateData(context) End Sub Private Shared Sub CreateData(ByVal context As IssuesContext) Dim users = OutlookDataGenerator.Users.[Select](Function(x) Dim split = x.Split(" "c) Return New User() With { .FirstName = split(0), .LastName = split(1) } End Function).ToArray() context.Users.AddRange(users) context.SaveChanges() Dim rnd = New Random(0) Dim issues = Enumerable.Range(0, 1000).[Select](Function(i) New Issue() With { .Subject = OutlookDataGenerator.GetSubject(), .UserId = users(rnd.Next(users.Length)).Id, .Created = Date.Today.AddDays(-rnd.Next(30)), .Priority = OutlookDataGenerator.GetPriority(), .Votes = rnd.Next(100) }).ToArray() context.Issues.AddRange(issues) context.SaveChanges() End Sub End Class
IssuesContext.cs
using System.Data.Entity; public class IssuesContext : DbContext { static IssuesContext() { Database.SetInitializer(new IssuesContextInitializer()); } public IssuesContext() { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Issue>() .HasIndex(x => x.Created); modelBuilder.Entity<Issue>() .HasIndex(x => x.Votes); } public DbSet<Issue> Issues { get; set; } public DbSet<User> Users { get; set; } }
IssuesContext.vb
Imports System.Data.Entity Public Class IssuesContext Inherits DbContext Shared Sub New() Database.SetInitializer(New IssuesContextInitializer()) End Sub Public Sub New() End Sub Protected Overrides Sub OnModelCreating(ByVal modelBuilder As DbModelBuilder) MyBase.OnModelCreating(modelBuilder) modelBuilder.Entity(Of Issue)().HasIndex(Function(x) x.Created) modelBuilder.Entity(Of Issue)().HasIndex(Function(x) x.Votes) End Sub Public Property Issues As DbSet(Of Issue) Public Property Users As DbSet(Of User) End Class
OutlookDataGenerator.cs
public static class OutlookDataGenerator { static Random rnd = new Random(0); static string[] Subjects = new string[] { "Developer Express MasterView. Integrating the control into an Accounting System.", "Web Edition: Data Entry Page. There is an issue with date validation.", "Payables Due Calculator is ready for testing.", "Web Edition: Search Page is ready for testing.", "Main Menu: Duplicate Items. Someone must review all menu items in the system.", "Receivables Calculator. Where can I find the complete specs?", "Ledger: Inconsistency. Please fix it.", "Receivables Printing module is ready for testing.", "Screen Redraw. Someone must look at it.", "Email System. What library are we going to use?", "Cannot add new vendor. This module doesn't work!", "History. Will we track sales history in our system?", "Main Menu: Add a File menu. File menu item is missing.", "Currency Mask. The current currency mask is completely unusable.", "Drag & Drop operations are not available in the scheduler module.", "Data Import. What database types will we support?", "Reports. The list of incomplete reports.", "Data Archiving. We still don't have these features in our application.", "Email Attachments. Is it possible to add multiple attachments? I haven't found a way to do this.", "Check Register. We are using different paths for different modules.", "Data Export. Our customers asked us for export to Microsoft Excel."}; public static readonly string[] Users = new string[] { "Peter Dolan", "Ryan Fischer", "Richard Fisher", "Tom Hamlett", "Mark Hamilton", "Steve Lee", "Jimmy Lewis", "Jeffrey McClain", "Andrew Miller", "Dave Murrel", "Bert Parkins", "Mike Roller", "Ray Shipman", "Paul Bailey", "Brad Barnes", "Carl Lucas", "Jerry Campbell", }; public static string GetSubject() { return Subjects[rnd.Next(Subjects.Length - 1)]; } public static string GetFrom() { return Users[rnd.Next(Users.Length)]; } public static Priority GetPriority() { return (Priority)rnd.Next(5); } }
OutlookDataGenerator.vb
Public Module OutlookDataGenerator Private rnd As Random = New Random(0) Private Subjects As String() = New String() {"Developer Express MasterView. Integrating the control into an Accounting System.", "Web Edition: Data Entry Page. There is an issue with date validation.", "Payables Due Calculator is ready for testing.", "Web Edition: Search Page is ready for testing.", "Main Menu: Duplicate Items. Someone must review all menu items in the system.", "Receivables Calculator. Where can I find the complete specs?", "Ledger: Inconsistency. Please fix it.", "Receivables Printing module is ready for testing.", "Screen Redraw. Someone must look at it.", "Email System. What library are we going to use?", "Cannot add new vendor. This module doesn't work!", "History. Will we track sales history in our system?", "Main Menu: Add a File menu. File menu item is missing.", "Currency Mask. The current currency mask is completely unusable.", "Drag & Drop operations are not available in the scheduler module.", "Data Import. What database types will we support?", "Reports. The list of incomplete reports.", "Data Archiving. We still don't have these features in our application.", "Email Attachments. Is it possible to add multiple attachments? I haven't found a way to do this.", "Check Register. We are using different paths for different modules.", "Data Export. Our customers asked us for export to Microsoft Excel."} Public ReadOnly Users As String() = New String() {"Peter Dolan", "Ryan Fischer", "Richard Fisher", "Tom Hamlett", "Mark Hamilton", "Steve Lee", "Jimmy Lewis", "Jeffrey McClain", "Andrew Miller", "Dave Murrel", "Bert Parkins", "Mike Roller", "Ray Shipman", "Paul Bailey", "Brad Barnes", "Carl Lucas", "Jerry Campbell"} Public Function GetSubject() As String Return Subjects(rnd.Next(Subjects.Length - 1)) End Function Public Function GetFrom() As String Return Users(rnd.Next(Users.Length)) End Function Public Function GetPriority() As Priority Return CType(rnd.Next(5), Priority) End Function End Module
1. 切換到涉及視圖,打開GridControl的并調用。
2. 選擇IssuesContext數據源。
3. 選擇Issue表。
4. 選擇InfiniteAsyncSource綁定模型,來無限滾動顯示數據。或者,您可以選擇PagedAsyncSource模型在頁面中顯示數據。
5. 確保Key Property設置為Id。
6. 在MainWindow.xaml.cs/MainWindow.xaml.vb中選擇Code-Behind來生成綁定代碼。
運行應用程序。
要在視圖模型中生成綁定代碼,請遵循以下步驟。
創(chuàng)建一個ViewModel模板,實現ViewModelBase并重建解決方案:
ViewModel.cs
using DevExpress.Mvvm; namespace WPFBlankAppWithDatabase { public class ViewModel : ViewModelBase { } } ViewModel.vb Imports DevExpress.Mvvm Namespace WPFBlankAppWithDatabase Public Class ViewModel Inherits ViewModelBase End Sub End Class End Namespace
請執(zhí)行步驟1-5。
選擇View Model將代碼添加到視圖模型中。
單擊Select a Data Context,選擇ViewModel類并點擊OK。
啟用Set selected class as the data context選項然后點擊Finish。
Items Source Wizard在ViewModel中生成數據綁定代碼,并在XAML中指定數據上下文和GridControl選項,運行應用程序來查看結果。
更多產品資訊及授權,歡迎來電咨詢:023-68661681
慧都是?家?業(yè)數字化解決?案公司,專注于軟件、?油與?業(yè)領域,以深?的業(yè)務理解和?業(yè)經驗,幫助企業(yè)實現智能化轉型與持續(xù)競爭優(yōu)勢。
慧都是DevExpress的中國區(qū)的合作伙伴,DevExpress作為用戶界面領域的優(yōu)秀產品,幫助企業(yè)高效構建權限管理、數據可視化(如網格/圖表/儀表盤)、跨平臺系統(WinForms/ASP.NET/.NET MAUI)及行業(yè)定制解決方案,加速開發(fā)并強化交互體驗。
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網