Обновить пользовательский интерфейс и свойство одновременно в mvvm

#c# #wpf #xaml #mvvm #data-binding

#c# #wpf #xaml #mvvm #привязка данных

Вопрос:

У меня есть текстовое поле .. я хочу, когда пользователь вводит любое значение в текстовое поле, которое я хочу, чтобы подтвердить введенное значение в LostFocus..

В настоящее время то, что происходит сейчас, мое свойство обновлено, но мой пользовательский интерфейс не обновляется одновременно .. я привел приведенный ниже код для этого:

  <local:Customdatepicker x:Uid="dateValue" x:Name="dateValue"  BorderThickness="0" 
                                                            Visibility="{Binding ShowDatePicker ,UpdateSourceTrigger=PropertyChanged}"
                                                            IsEnabled="{Binding FieldValueIsEditable,UpdateSourceTrigger=PropertyChanged}"
                                                           DateCoordinates="{Binding CoOrdinates,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" 
                                                            Text="{Binding DateFieldValue,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, TargetNullValue=''}" 
                                                            Loaded="dateValue_Loaded" LostFocus="dateValue_LostFocus"
                                                           Style="{StaticResource DatePickerStyle}" 
                                                            Width="{Binding DatePickerWidth,UpdateSourceTrigger=PropertyChanged}" 
                                                            MouseDoubleClick="dateValue_MouseDoubleClick" 
                                                            DisplayDate="{Binding DisplayDateFieldValue, Mode=TwoWay}"
                                                             >
                                    </local:Customdatepicker>
  

Я попробовал следующие два способа

Сначала я взял «UpdateSourceTrigger = PropertyChanged», но в этом случае мой пользовательский интерфейс не обновляется

 Text="{Binding DateFieldValue,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, TargetNullValue=''}"
  

Во втором случае я взял «UpdateSourceTrigger = LostFocus», но в этом случае я не получил обновленное значение текстового поля.
Итак, как я могу достичь обоих одновременно, то есть обновленного значения в пользовательском интерфейсе.

Также я уже использую INotifyPropertyChanged, это тоже не работает.Пожалуйста, помогите мне, как я могу это решить.

ViewModel:

  private string _datefieldvalue;
        public string DateFieldValue
        {
            get { return _datefieldvalue; }
            set
            {
                value = value == null ? string.Empty : value.Trim();
                if (string.IsNullOrEmpty(value))
                {
                    _datefieldvalue = ValidateDateValue("");
                    FirePropertyChanged();
                }
                else  if (!_datefieldvalue.Equals(value, StringComparison.CurrentCultureIgnoreCase))
                {
                    _datefieldvalue = ValidateDateValue(value);
                    FirePropertyChanged();
                }

            }
        }

public class BaseObservableObject : INotifyPropertyChanged
    {
        #region PropertyChangedEventHandler   

        public event PropertyChangedEventHandler PropertyChanged;

        protected void FirePropertyChanged([CallerMemberName] string propName = null)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propName));
            }
        }

        #endregion
    }
  

Комментарии:

1. Удалите UpdateSourceTrigger , и оно должно правильно обновляться всякий раз, когда значение изменяется в представлении или модели, поскольку вы указали Mode=TwoWay

2. @Ephraim если я удалю UpdateSourceTrigger, то предположим, что я потерял фокус, если я хочу одновременно изменить значение текстового поля в пользовательском интерфейсе, как я могу этого добиться??? Пожалуйста, прочитайте мой опубликованный вопрос еще раз

3. @stylishCoder: как мы утверждали вчера, проблема, похоже, существует. Можете ли вы сказать нам, какое значение вы хотели бы записать после проверки в Text свойство вашего средства выбора, когда фокус оставлен? И в каком случае… Я думаю, что это очень проблематично, работая против проверки средства выбора. Недопустимые тексты удаляются автоматически, чтобы получить DateTime объекты в качестве выходных данных. На мой взгляд, вы пытаетесь работать против этого, и это вообще не сработает, потому что элемент управления автоматически изменит свое Text свойство на действительную DateTime строку при потере фокуса.

4. @WPFGermany да, именно ваша точка зрения верна .. на самом деле для этого я попытался сохранить значение textbox в свойстве string и при потере фокуса я снова присваиваю значение textbox, но не сработало … еще одна вещь, которую я взял свойство «string», которое привязано к тексту Customdatepicker .. можем ли мы применить какой-либо хак для одновременного обновления пользовательского интерфейса????

5. Указав UpdateSourceTrigger , вы не разрешаете какое-либо обновление пользовательского интерфейса для элемента управления, если событие не инициировано. Этого не происходит, когда вы изменяете значение свойства в своей модели представления. Понимаете мою точку зрения?