mvvm - prismv2 - INotifyPropertyChanged - PullRequest
       41

mvvm - prismv2 - INotifyPropertyChanged

0 голосов
/ 28 апреля 2010

Так как это так долго и выпадало, и действительно не задает связного вопроса:

1: как правильно реализовать свойства объекта первичного объекта в модели представления?

2: Кто-нибудь нашел способ исправить проблему Delegatecommand.RaiseCanExecuteChanged? или мне нужно исправить это самостоятельно, пока MS не сделает?

Для остальной части истории ... продолжить.

В моей модели представления у меня есть свойство объекта doctor, связанное с моим Model.Doctor, который является объектом EF POCO. У меня есть onPropertyChanged ("Доктор") в установщике как таковой:

       Private Property Doctor() As Model.Doctor
            Get
                Return _objDoctor
            End Get
            Set(ByVal Value As Model.Doctor)
                _objDoctor = Value
                OnPropertyChanged("Doctor")
            End Set
        End Property

Единственный раз, когда OnPropertyChanged срабатывает, если изменяется ВСЕ объект. Это не будет проблемой, за исключением того, что мне нужно знать, когда меняются свойства доктора, чтобы я мог включить другие элементы управления в моей форме (например, кнопку «Сохранить»). Я попытался реализовать это следующим образом:

Public Property FirstName() As String
        Get
            Return _objDoctor.FirstName
        End Get
        Set(ByVal Value As String)
            _objDoctor.FirstName = Value
            OnPropertyChanged("Doctor")
        End Set
    End Property

это взято из элементов управления XAMLPowerToys из Karl Shifflet, поэтому я должен предположить, что это правильно. Но я не могу заставить его работать.

Я включил сюда PRISM, потому что я использую контейнер для единства, чтобы создать экземпляр моего представления, и он ЕДИНИЧНЫЙ. Я получаю уведомление об изменении модели представления через eventaggregator, который затем заполняет Doctor новым значением. Причина, по которой я делаю все это, из-за DelegateCommand PRISM. Так что, возможно, это моя настоящая проблема.

Похоже, что существует ошибка в DelegateCommand, которая не запускает метод RaiseCanExecuteChanged для команд, которые его реализуют, и, следовательно, необходимо запускать вручную. У меня есть код для этого в моем onPropertyChangedEventHandler. Конечно, это также не реализовано через интерфейс ICommand, поэтому мне нужно сломать и сделать мои свойства DelegateCommand (из X) так, чтобы у меня был доступ к RaiseCanExecuteChanged каждой команды.

Ответы [ 2 ]

1 голос
/ 29 апреля 2010

2: Кто-нибудь нашел способ исправить delegatecommand.RaiseCanExecuteChanged вопрос? или мне нужно это исправить самому пока MS не делает?

Используйте делегат Джоша Смита RelayCommand вместо DelegateCommand. Это устраняет проблему с невыполняемыми командами CanExecute и не приводит к утечке памяти, например DelegateCommand:

"Он делегирует подписку на событие событию CommandManager.RequerySuggested. Это гарантирует, что инфраструктура команд WPF запрашивает все объекты RelayCommand, могут ли они выполняться всякий раз, когда запрашиваются встроенные команды."

0 голосов
/ 29 апреля 2010

О 2: Microsoft не исправляет ошибку, так как именно по идее вы должны явно указать команде переоценить себя. Конечно, вы можете не согласиться с их решением.

Если вы хотите, чтобы DelegateCommands повторно оценивали каждый раз, когда запускается RaiseCanExecuteChanged, см. http://compositewpf.codeplex.com/Thread/View.aspx?ThreadId=47338

...