Во-первых, вы не должны реализовывать модель представления для просмотра преобразования внутри модели представления.
Для этого сценария вы должны внедрить IValueConverter
(см. Документы Microsoft: преобразование данных ).
Чтобы решить вашу проблему, у вас есть два варианта: использовать Binding.UpdateSourceTrigger
по умолчанию TextBox
, то есть UpdateSourceTrigger.LostFocus
, или отменить обновление привязки, если значение TextBox.Text
заканчивается указанным c разделитель.
Рекомендую вернуться к значению UpdateSourceTrigger.LostFocus
. Нет смысла проверять ввод для каждого символа. UpdateSourceTrigger.LostFocus
имеет смысл в сценарии ios, например, при проверке орфографии или при наборе текста.
В следующем примере показано, как использовать правильное преобразование значения и подавить привязку:
ViewModel.cs
class ViewModel : INotifyPropertyChanged, IDataErrorInfo
{
private DataModel Data { get; set; }
private List<string> propName;
public List<string> PropName
{
get => this.Data;
set
{
this.Data.PropName = value;
RaisePropertyChanged();
}
}
}
ListToStringConverter.cs
[ValueConversion(typeof(List<string>), typeof(string))]
public class ListToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value is IEnumerable<string> stringCollection
? string.Join(";", stringCollection)
: Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string[] stringSeparators = new string[] {";", " "};
return value is string stringValue && stringValue.LastIndexOfAny(stringSeparators) < stringValue.Length - 1
? stringValue.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries).ToList()
: Binding.DoNothing;
}
}
MainWindow.xaml
<Window>
<Window.DataContext>
<ViewModel />
</Window.DataContext>
<TextBox>
<TextBox.Text>
<Binding Path="PropName" UpdateSourceTrigger="PropertyChanged">
<Binding.Converter>
<ListToStringConverter />
</Binding.Converter>
<Binding.ValidationRules>
<DataErrorValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</Window>