Среда: VS2010, SL4, RIA Services
У меня есть пользовательский интерфейс SL4, который я разработал для объектов данных, экземпляры которых были созданы из XML-файла (так что мне не приходилось беспокоиться о серверной части приложения, пока я работал с клиентской частью). В этом пользовательском интерфейсе у меня есть сетка данных, которая показывает свойства для каждого объекта в коллекции данных. У меня также есть панель деталей, которая показывает редактируемые детали для объекта, выбранного в сетке данных.
В этой версии, которая использует «имитирующие» данные, у меня есть привязка для редактируемых свойств, установленная как TwoWay. Когда я редактирую значение на панели сведений, соответствующее значение в сетке данных обновляется. (Я не разрешаю редактировать непосредственно в сетке.) Я могу перейти к другой записи, затем вернуться к записи, которую я изменил, и я вижу, что значение было успешно изменено (по крайней мере, на стороне клиента).
Затем я добавил в смесь службы RIA, так что теперь я получаю данные из серверной части. Данные загружаются нормально, но когда я пытаюсь изменить значение свойства на панели сведений, оно не «прилипает». То есть значение в сетке данных не обновляется, чтобы отразить новое значение, и если я перейду к другой записи и вернусь к измененной записи, отображается старое значение.
Поскольку RIA Services - это то, что изменилось, Я предполагаю, что в этом и заключается проблема.
Следующий шаг ... Я поместил точку останова в коде, сгенерированном службами RIA для использования на стороне клиента, внутри установщика для значения, которое я изменяю. Когда данные загружаются впервые, код в сгенерированном сеттере работает нормально. Однако когда я вношу изменения в свойство, возникает проблема.
Вот сгенерированный код в сеттере:
set
{
if ((this._quantity != value))
{
this.OnQuantityChanging(value);
this.RaiseDataMemberChanging("Quantity");
this.ValidateProperty("Quantity", value);
this._quantity = value;
this.RaiseDataMemberChanged("Quantity");
this.OnQuantityChanged();
}
}
После изменения данных я просматриваю приведенный выше код в отладчике. Когда я выполняю строку «RaiseDataMemberChanging ...», установщик завершает работу, а остальные операторы не выполняются. Кажется, что исключение не генерируется, и приложение продолжает работу, но значение не обновляется, потому что строка кода в установщике, которая фактически устанавливает значение, не кажется выполненной.
Любые идеи о том, в чем проблема (или, по крайней мере, что я должен попробовать дальше)?
Вот некоторая дополнительная информация, которая может быть полезна:
Редактирование происходит в текстовом поле на панели сведений. Вот Xaml для текстового поля:
<TextBox Grid.Row="2" Grid.Column="0" Text="{Binding Quantity, Mode=TwoWay}" />
Вот привязка, используемая в сетке данных. (Я не разрешаю редактировать там. Я установил IsReadOnly = "True" для сетки данных.):
<data:DataGridTextColumn Binding="{Binding Quantity}" Header="Quantity" />
Оба они не изменились с того момента, когда я привязывался к фиктивным данным. Код программной части пришлось изменить, чтобы выполнить привязку к другому источнику данных. Вот код привязки из фиктивной версии данных:
InitializeComponent();
_industrialDetailsView = new PagedCollectionView((IEnumerable)IndustrialDetailsData.DataSource);
grid.ItemsSource = _industrialDetailsView;
А вот код привязки, который использует службы RIA. Обратите внимание, что на стороне сервера есть IndustrialDetailsService, из которого IndustrialDetailsContext генерируется службами RIA.
_industrialDetailsContext = new IndustrialDetailsContext();
_industrialDetailsContext.Load<IndustrialDetailDto>(_industrialDetailsContext.GetByFacilityAndAssessmentYearQuery(202, 2009),
loadOperation =>
{
_industrialDetailsView = new PagedCollectionView(loadOperation.Entities);
grid.ItemsSource = _industrialDetailsView;
}, null);The data context for the details panel has not changed. It is set from the data grid's SelectionChanged event handler like so:
IndustrialDetailDto industrialDetails = (IndustrialDetailDto)grid.SelectedItem;
DetailsView.DataContext = industrialDetails;
Пожалуйста, дайте мне знать, если есть другая информация, которая будет полезна.