Я действительно застрял, пытаясь внедрить RIA Services с MVVM и грубой сеткой данных. Я думаю, что мне не хватает какой-то ключевой идеи. Все примеры, которые я видел, используют кнопку отправки или аналогичную для отправки данных клиенту. Я бы предпочел отправить, как только строка будет добавлена / удалена / изменена. Я подумал о паре подходов:
- Имейте мое свойство IEnuerable Itemsource, автоматически связываемое с объектным контейнером моего контекста. Я пробовал это, но я не могу установить объекты контекста из свойства.
- Захватите события изменения строки и вручную сообщите моему контексту, что это изменило элементы. Это не правильно, хотя в проекте MVVM, учитывая, что мое свойство Commodity должно отражать изменения в сетке данных.
Кроме того, как мне сообщить RIA Services, какой метод следует использовать для конкретной операции crud? Это происходит на клиенте или сервере?
Примечание. Я использую сетку данных ComponentOne, хотя я не думаю, что ее поведение будет отличаться от обычной сетки данных Silverlight для этого простого примера.
Вид:
<c1grid:C1DataGrid x:Name="C1Grid" AutoGenerateColumns="False"
ItemsSource="{Binding Commodities}">
<c1grid:C1DataGrid.Columns>
<c1grid:DataGridTextColumn Binding="{Binding Name, Mode=TwoWay}"></c1grid:DataGridTextColumn>
</c1grid:C1DataGrid.Columns>
</c1grid:C1DataGrid>
ViewModel:
public class CommodityViewModel : Model
{
private CommodityContext _context;
private Commodity _selectedCommodity;
public IEnumerable<Commodity> Commodities
{
get { return _context.Commodities;}
//Setter wont work here
}
public CommodityViewModel()
{
_context = new CommodityContext();
_context.Load(_context.GetCommoditiesQuery(), (LoadOperation<Commodity> loadOperation) =>
{
RaisePropertyChanged("Commodities");
_context.Commodities.EntityAdded += Commodities_EntityAdded;
}, null );
}
private void Commodities_EntityAdded(object sender, EntityCollectionChangedEventArgs<Commodity> e)
{
//how does RIA know to use my AddCommodity method on the server side? Where do I set this?
_context.SubmitChanges();
}
}