Двухсторонняя привязка в SL4 перестает работать, когда я добавляю RIA Services в смесь. Решение? - PullRequest
0 голосов
/ 09 июля 2010

Среда: 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;

Пожалуйста, дайте мне знать, если есть другая информация, которая будет полезна.

1 Ответ

0 голосов
/ 13 июля 2010

Я наконец определил природу проблемы, когда сделал редактируемую сетку данных и попытался изменить значение непосредственно в сетке данных.Когда я это сделал, я получил сообщение об ошибке:

«Этот EntitySet типа« X »не поддерживает операцию« Изменить »».

Затем я смог решить проблему, добавив методы-заполнители в службу домена для «Удалить», «Вставить» и «Обновить», чтобы сгенерированный EntitySet позволял редактировать.

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

...