Проблем с текущия елемент на формуляр за данни Silverlight

Имам страница с две контроли върху нея, мрежа за данни и форма за данни.

В мрежата с данни имам списък с всички обекти от определен клас. Когато потребителят избере елемент в мрежата с данни, формулярът за данни се зарежда с избрания обект.

dataForm.CurrentItem = изглед.CurrentItem; изгледът е PagedCollectionView, който съдържа само избрания елемент.

Проблемът ми е, че когато задавам свойството currenitem на dataform, ако използвам само PagedCollectionView (изглед) без .CurrentItem, губя валидирането на dataform. Всички задължителни полета не се виждат като задължителни. Ако използвам pcv.CurrentItem като валидиране CurrentItem на моя формуляр за данни работи добре, но тогава възниква друг проблем.

Когато използвам текущия елемент на PagedCollectionView като текущия елемент на формуляра за данни:

Потребителят избира елемент в мрежата с данни и обектът се зарежда добре във формуляра за данни. Ако потребител промени определена стойност в някое от текстовите полета на формуляра за данни и след това избере различен елемент, с който да зареди формуляра за данни, се извежда следната грешка:

„Не може да се промени валутата, когато даден елемент има грешки при валидиране или се редактира и AutoCommit е невярно. Задайте ItemsSource на ICollectionView, за да управлявате валутата вместо това.“ Не използвам свойствата за страниране на формуляра за данни и имам собствен бутон за запазване във формуляра.

Ще се радвам на всякаква помощ, това е първият ми проект в Silverlight, върху който работя.

Редактиране - Използвах dataform.CommitEdit, когато променях текущия елемент на dataform. Едно нещо, което това не реши, е, че ако има грешка при валидиране на формуляра, грешката във валутата се хвърля. Има ли все пак това да се заобиколи. AutoEdit е true и AutoCommit е false за формуляра за данни


person user531958    schedule 06.12.2010    source източник


Отговори (3)


Малко е трудно да се определи точно какво се случва тук без проба, но ето едно наблюдение, което може да помогне за разрешаването на проблема. Опитайте вместо това да свържете свойството ItemsSource както на DataGrid, така и на DataForm към изгледа на колекцията и не свързвайте свойството CurrentItem на DataForm. Те се поддържат магически в синхрон (избраният елемент в DataGrid ще зададе текущия елемент във Form за данни) - това е функция на CollectionView. Това може или не може да реши проблема ви, но така или иначе няма да навреди :).

Откровена самореклама: тази и други функции на CollectionView са разгледани в моята книга Професионални бизнес приложения със Silverlight 4 :).

person Chris Anderson    schedule 06.12.2010
comment
Здравей Крис, благодаря за предложението. Опитах този метод и все още получавам същата грешка. - person user531958; 06.12.2010
comment
Опитах какво направи Jhelumi в публикацията си (изглежда, че имахме същия проблем) stackoverflow.com/questions/3969588/ - person user531958; 06.12.2010
comment
И това изглежда е решило проблема. Все пак много благодаря - person user531958; 06.12.2010
comment
Това също ми подейства. В един от моите сценарии, при който не използвах PagedCollectionView, добавих CollectionViewSource и обвържете както DataGrid, така и DataForm ItemsSource към това, за да получите поведението за синхронизиране на SelectedItem / CurrentItem. - person Martin Hollingsworth; 23.11.2011

Имах този проблем много пъти. И винаги в случай, че добавяте нов артикул. След няколко разочароващи дни изтеглих изходните кодове на Silverlight toolkit. (Можете да намерите в директорията Programs FIles (Моята беше C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Toolkit\Apr10\Source) ) Компилиране и справка вместо асемблиране System.Windows. Controls.Data.DataForm.Toolkit

В режим на отстраняване на грешки виждаме странно поведение в DataForm.cs:

private static void OnCurrentItemPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DataForm dataForm = d as DataForm;
            if (dataForm != null && !dataForm.AreHandlersSuspended())
            {
                if (dataForm._lastItem != null && dataForm.ShouldValidateOnCurrencyChange)
                {
                    dataForm.ValidateItem();
                }

                if ((!dataForm.AutoCommitPreventsCurrentItemChange && dataForm.IsItemValid) &&
                    (e.NewValue == null ||
                    dataForm._collectionView == null ||
                    dataForm._collectionView.Contains(dataForm.CurrentItem) 
                    ))
                {
                    dataForm.SetUpNewCurrentItem();
                    dataForm.GenerateUI(true /* clearEntityErrors */, true /* swapOldAndNew */);
                    dataForm.UpdateCurrentItem();
                    SetAllCanPropertiesAndUpdate(dataForm, false /* onlyUpdateStates */);
                    dataForm._lastItem = dataForm.CurrentItem;
                    dataForm.OnCurrentItemChanged(EventArgs.Empty);
                }
                else
                {
                    dataForm.SetValueNoCallback(e.Property, e.OldValue);
                    throw new InvalidOperationException(string.Format(Globalization.CultureInfo.InvariantCulture, System.Windows.Controls.Data.DataForm.Toolkit.Resources.DataForm_CannotChangeCurrency, "AutoCommit", "ItemsSource", "ICollectionView"));
                }
            }
        }

dataForm._collectionView.Contains(dataForm.CurrentItem) връща false дори същият обект да съществува в dataForm._collectionView

Промених условието:

if ((!dataForm.AutoCommitPreventsCurrentItemChange && dataForm.IsItemValid) &&
                    (e.NewValue == null ||
                    dataForm._collectionView == null ||
                    dataForm._collectionView.Contains(dataForm.CurrentItem) || 
                    dataForm.CurrentItem == e.NewValue
                    ))

И DataForm започна да работи добре. Без изключения и грешки.

person Roman Melnyk    schedule 07.12.2012

Проверете за грешки при валидиране, когато обвързвате текущия елемент, ако имате такива, изчистете ги BindingItem.ValidationErrors.Clear(); след това свържете елемента към dataform.

person Goutam Sindur    schedule 06.09.2013