Как сделать самоконтроль сущностей с изменениями в ВМ и UI? - PullRequest
0 голосов
/ 26 августа 2010

мой контекст: Entity Framework 4.0 + WCF Ria Data Service + Silverlight 4. Предположим, у меня есть сущность People из EF, затем я создал PeopleVM как:

public class PeopleViewModel : ViewModelBase
    {
        public PeopleViewModel(){
       //....
           this._hasChanges = MyDomainContext.HasChanges;
        }

        private People _People;
        public People People
        {
            get { return _People; }
            set
            {
                if (value != this._People)
                {
                    value = this._People;
                    this.RaisePropertyChanged("People");
                }
            }
        }

        private bool _hasChanges;
        public bool HasChanges
        {
            get { return this._hasChanges; }
            set
            {
                if (this._hasChanges != value)
                {
                    this._hasChanges = value;
                    this.RaisePropertyChanged("HasChanges");
                }
            }
        }

        //........

        private RelayCommand _saveCommand = null;
        public RelayCommand SaveCommand
        {
    //.....
        }

        private RelayCommand _cancelCommand = null;
        public RelayCommand CancelCommand
        {
    //.....
        }
   }

в пользовательском интерфейсе xaml, я установил привязку как:

<TextBox Text="{Binding People.FirstName, Mode=TwoWay}" />
<TextBox Text="{Binding People.LasttName, Mode=TwoWay}" />

Затем я устанавливаю кнопку в пользовательском интерфейсе как:

<Button Content="Save" Command="{Binding SaveCommand}"  IsEnabled="{Binding HasChanges}"/>
<Button Content="Undo" Command="{Binding CancelCommand}" IsEnabled="{Binding HasChanges}"/>

Итак, что я хочу:

  1. изначально, кнопка должна быть отключенапотому что нет изменений данных.

  2. когда пользователь вводит некоторые в текстовое поле FirstName, LastName, кнопка должна быть включена.

Но с вышекод, даже я меняю имя, фамилию, кнопка все еще в отключенном состоянии.

Как решить эту проблему?

1 Ответ

1 голос
/ 21 июня 2011

Проблема в том, что свойство HasChanges вашей viewmodel не обновляется при обновлении свойства HasChanges в контексте вашего домена. Обычно я просто представляю Контекст домена как свойство модели представления и привязываю состояние включенных кнопок непосредственно к его свойству HasChanges.

public class PeopleViewModel : ViewModelBase
    {
        public PeopleViewModel(DomainContext context){
            this.Context = context;
        }

        public DomainContext Context
        { get; private set; }


        private People _People;
        public People People
        {
            get { return _People; }
            set
            {
                if (value != this._People)
                {
                    value = this._People;
                    this.RaisePropertyChanged("People");
                }
            }
        }

        //........

        private RelayCommand _saveCommand = null;
        public RelayCommand SaveCommand
        {
    //.....
        }

        private RelayCommand _cancelCommand = null;
        public RelayCommand CancelCommand
        {
    //.....
        }
   }

Вот XAML для интерфейса пользователя для привязки к контексту HasChanges:

<Button Content="Save" Command="{Binding SaveCommand}"  IsEnabled="{Binding Context.HasChanges}"/>
<Button Content="Undo" Command="{Binding CancelCommand}" IsEnabled="{Binding Context.HasChanges}"/>

Необходимо убедиться, что объект People извлечен из DomainContext, чтобы обновления влияли на свойство HasChanges этого DomainContext.

...