Привязка TwoWay в SL4 перестает работать, когда я добавляю в смесь службы RIA. Решение?

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

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


person MylesRip    schedule 09.07.2010    source источник


Ответы (1)


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

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

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

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

person MylesRip    schedule 13.07.2010