Как определить источник данных для добавления строк в привязку источника данных к сетке данных Silverlight? - PullRequest
1 голос
/ 22 февраля 2011

Я использую книгу для изучения и застрял здесь

Если у вас есть ссылка на связанную коллекцию (или вы можете привести значение свойства ItemsSource в DataGrid к этому типу), тогдау вас должна быть возможность просто вызывать метод Add или Insert.

моя страница xaml

public About()
        {
            InitializeComponent();

            this.Title = ApplicationStrings.AboutPageTitle;


            EntityQuery<Web.Models.Class1> qry = context.GetProductSummaryListQuery();
            //page 167
            qry = qry.OrderBy(p => p.Name);
            //the following is asynchronous, therefore any immediate WORKING ON RESULT
            //must be done in the oparation.completed event
            LoadOperation<Web.Models.Class1> operation = context.Load(qry);
            dataGrid1.ItemsSource = operation.Entities;



            //context.Class1s.
           // bool changes_there = context.HasChanges;
        }

мой класс

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;


namespace Tutorial1.Web.Models
{
    public partial class Class1
    {

        [Key]
        [Editable(false)]
        public int ID { get; set; }
        public string Name { get; set; }
        public string Number { get; set; }
        public decimal ListPrice { get; set; }
        public byte[] ThumbNailPhoto { get; set; }
        public int? QuantityAvailable { get; set; }
        public string Category { get; set; }
        public string SubCategory { get; set; }
        public string Model { get; set; }
        public bool MakeFlag { get; set; }
    }

}

мой сервис

namespace Tutorial1.Web.Services
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.ServiceModel.DomainServices.Hosting;
    using System.ServiceModel.DomainServices.Server;
    using Tutorial1.Web.Models;

    // TODO: Create methods containing your application logic.
    [EnableClientAccess()]
    public class ProductPMService : DomainService
    {
        private AdventureWorksLTEntities context = new AdventureWorksLTEntities();

        public IQueryable<Web.Models.Class1> GetProductSummaryList()
        {
            return from p in this.context.Products
                   select new Web.Models.Class1()
                   {
                       ID = p.ProductID,
                       ListPrice = p.ListPrice,
                       Name=p.Name
                   };

        }



        public IQueryable<ProductPM> GetProductsFromDB()
        {
            return from p in context.Products
                   select new ProductPM()
                   {
                       ProductID = p.ProductID,
                       Name = p.Name,
                       ProductNumber = p.ProductNumber,
                       ListPrice = p.ListPrice,
                       ModifiedDate = p.ModifiedDate
                   };

        }//get products

        public void InsertProductToDB(ProductPM the_class)
        {
            Product product = new Product();
            product.Name = the_class.Name;
            product.ProductNumber = the_class.ProductNumber;
            product.ListPrice = the_class.ListPrice;
            product.ModifiedDate = DateTime.Now;


            //concurrency
            //ProductPM originalproduct = ChangeSet.GetOriginal<ProductPM>(the_class);


            context.Products.AddObject(product);
            context.SaveChanges();

            ChangeSet.Associate(the_class, product, UpdateProductPMKeys);
        }//InsertProduct

        private void UpdateProductPMKeys(ProductPM the_class, Product product)
        {//reflecting the generated id back.
            the_class.ProductID = product.ProductID;
            the_class.ModifiedDate = product.ModifiedDate;
        }//reflecting the generated id back ends


        protected override void OnError(DomainServiceErrorInfo errorInfo)
        {
            // Log exception here
                    }

    }
}

Я не понимаю, что является источником привязки, и где я должен добавить строку при нажатии кнопки.

1 Ответ

1 голос
/ 27 февраля 2011

Я вижу две проблемы в вашем коде.

1) В коде за вашей страницей xaml вы присваиваете результаты операции загрузки для ItemsSource вашей таблицы данных.

dataGrid1.ItemsSource = operation.Entities;

Проблема в том, что operation.Entities имеет тип IEnumerable<TEntity> и поэтому не имеет метода Add. Я предлагаю определить ObservableCollection и использовать его в качестве ItemsSource и заполнить его содержимым операции. Объекты в методе обратного вызова вашей Load-операции. Возможно, вы могли бы использовать что-то вроде этого (упрощенная версия, не проверенная):

public ObservableCollection<Web.Models.Class1> Class1Collection { get; set; }

context.Load<T>(qry, r =>
{
  if (r.HasError)
  {
    // error handling
  }
  else if (r.Entities.Count() > 0)
  {
    this.Class1Collection.Clear();
    foreach (Web.Models.Class1 c in r.Entities)
    {
      this.Class1Collection.Add(c);
    }
  }
  else 
  {
    // handle case when no Entities were returned
  }
}, null);

В вашем конструкторе используйте это:

dataGrid1.ItemsSource = this.Class1Collection;

Если вы сделаете это, вы можете добавить новый элемент, используя:

Web.Models.Class1 newItem = new Web.Models.Class1();
this.Class1Collection.Add(newItem);
context.GetEntitySet<Web.ModelsClass1>().Add(newItem);

2) Вы не определили метод вставки или обновления для Class1 в вашем DomainService. Меня немного смущает использование вами Class1 и ProductPM. Они должны быть одинаковыми?

В любом случае, если вы хотите добавить новые экземпляры Class1, вам необходимо иметь метод InsertClass1(Class1 newObject) в вашем DomainService (и, предпочтительно, метод Update тоже).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...