#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
, вы не разрешаете какое-либо обновление пользовательского интерфейса для элемента управления, если событие не инициировано. Этого не происходит, когда вы изменяете значение свойства в своей модели представления. Понимаете мою точку зрения?