Среда: VS2010, SL4, RIA Services
У меня есть пользовательский интерфейс SL4, который я разработал для объектов данных, которые были созданы из файла XML (чтобы мне не приходилось беспокоиться о серверной части приложения, пока я работал над интерфейсом). В этом пользовательском интерфейсе у меня есть сетка данных, которая показывает свойства для каждого объекта в наборе данных. У меня также есть панель сведений, которая показывает редактируемые детали для объекта, выбранного в сетке данных.
В этой версии, которая использует «поддельные» данные, у меня есть привязка для редактируемых свойств, заданная как TwoWay. Когда я редактирую значение на панели сведений, соответствующее значение в сетке данных обновляется. (Я не разрешаю редактирование непосредственно в сетке.) Я могу перейти к другой записи, затем вернуться к записи, которую я изменил, и я вижу, что значение было успешно изменено (по крайней мере на стороне клиента).
Затем я добавил RIA Services в набор, так что теперь я получаю данные из серверной части. Данные загружаются нормально, но когда я пытаюсь изменить значение свойства на панели сведений, оно не «прилипает». То есть значение в сетке данных не обновляется, чтобы отразить новое значение, и если я перейду к другой записи и вернусь к измененной записи, отобразится старое значение.
Поскольку 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 Services. Обратите внимание, что на стороне сервера имеется IndustrialDetailsService, из которого RD Services генерирует IndustrialDetailsContext.
_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;
Пожалуйста, дайте мне знать, если есть другая информация, которая будет полезна.