与上一个教程一样,将不使用数据库,而是创建一个简单的集合,将以编程方式创建这个集合。这将允许只看到OData部分。
首先,打开项目,在Visual Studio 2010(或更高版本)中,从下面链接的zip文件中打开:
选择“添加”,然后“新建项目...”创建一个新的Silverlight应用程序。添加一个服务引用。点击“发现”。创建一个名为wsSampleCustomerData的引用。接下来,在Silverlight项目中添加以下程序集引用:
在Silverlight项目中,删除MainPage.xaml。打开项目在Expression Blend 4(或更高版本)中。在Expression Blend中,选择“文件”然后“新建项目...”选择“带有ViewModel的用户控件”模板,并创建一个名为MainPage.xaml的文件。它将创建ViewModel页面(MainPage.xaml和MainPage.xaml.cs与一个已经连接的MainPageModel.cs视图模型页面)。
创建一个名为Model的文件夹和一个名为Model.cs的类。用以下代码替换所有代码:
C#
using System;
using System.Linq;
using System.Collections.Generic;
using SilverlightODataSample.wsSampleCustomerData;
using System.Data.Services.Client;
namespace SilverlightODataSample
{
    public class Model
    {
        #region GetCustomers
        public static IObservable> GetCustomers(int intPage)
        {
            // Create a URI that points to theODataService
            Uri objUri = new Uri(GetBaseAddress(), UriKind.RelativeOrAbsolute);
            // Set up oData service call
            SampleDataSource SDS = new SampleDataSource(objUri);
            // Construct a Query
            var query = (from SampleCustomerData in SDS.SampleCustomerData
                         where SampleCustomerData.CustomerNotes.Contains("3")
                         select SampleCustomerData).Skip(intPage).Take(10);
            // Set up a DataServiceCollection to hold the results
            DataServiceCollection CustomerRecords = new DataServiceCollection();
            // Set up a Rx Observable (in a variable called observable)
            // that will contain the results of
            // the "LoadCompleted" event that CustomerRecords will fire
            // When LoadAsync(query) is fired in the following statement
            IObservable> observable = Observable.FromEvent(CustomerRecords, "LoadCompleted");
            // Execute the LoadAsync on CustomerRecords passing
            // the query that was constructed earlier
            CustomerRecords.LoadAsync(query);
            // Return observable
            return observable;
        }
        #endregion
        #region GetBaseAddress
        private static string GetBaseAddress()
        {
            // This gets the address of the webservice by
            // getting the AbsoluteUri and then stripping out the
            // name of the .xap file
            string strXapFile = @"/ClientBin/SilverlightODataSample.xap";
            string strBaseWebAddress = App.Current.Host.Source.AbsoluteUri.Replace(strXapFile, "");
            return string.Format("{0}/{1}", strBaseWebAddress, "Service.svc");
        }
        #endregion
    }
}
         
打开MainPageModel.cs并用以下代码替换所有代码:
C#
using System;
using System.ComponentModel;
using System.Collections.ObjectModel;
using SilverlightODataSample.wsSampleCustomerData;
using System.Data.Services.Client;
namespace SilverlightODataSample
{
    public class MainPageModel : INotifyPropertyChanged
    {
        public MainPageModel()
        {
            // When the Control loads
            // Get the Customers
            GetCustomers();
        }
        #region GetCustomers
        private void GetCustomers()
        {
            // Call the Model to get the Customers
            // Passing in 0 to get the first page
            // Paging could easily be done here
            // You could also pass in other criteria
            Model.GetCustomers(0).Subscribe(p =>
            {
                // Check for an error in the Service
                if ((p.EventArgs.Error == null))
                {
                    // loop thru each item in the
                    // DataServiceCollection
                    // Collection
                    foreach (CustomerRecord Customer in (DataServiceCollection)p.Sender)
                    {
                        // Add to the Customer to the colCustomerRecord
                        // Collection so the View can bind to it
                        colCustomerRecord.Add(Customer);
                    }
                }
            });
        }
        #endregion
        #region CustomerRecord
        // The View will bind to this collection and automatically be notified if
        // The collection changes. The Designer can bind any UI element that
        // can hold a collection
        private ObservableCollection _colCustomerRecord = new ObservableCollection();
        public ObservableCollection colCustomerRecord
        {
            get { return _colCustomerRecord; }
            private set
            {
                if (colCustomerRecord == value)
                {
                    return;
                }
                _colCustomerRecord = value;
                this.NotifyPropertyChanged("colCustomerRecord");
            }
        }
        #endregion
        #region INotifyPropertyChanged
        // This is a supporting method to raise a notification for any
        // Element that is subscribed to a Property that implements
        // NotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
        #endregion
    }
}
         
抓取一个DataGrid并将其拖放到设计表面上。将其加宽以填充页面。点击“数据”选项卡,以便看到数据上下文。将colCustomerRecord集合拖放到DataGrid上。构建并运行项目。