Я разрабатываю приложение UWP, использующее парадигму MVVM.Мое представление содержит простой TextBox, свойство Text
которого привязано к соответствующему свойству ViewModel:
<TextBox Text="{Binding Path=Radius, Mode=TwoWay}"/>
Естественно, я назначил свою ViewModel для DataContext
:
public sealed partial class ExamplePage : Page
{
private ExamplePageVM viewModel;
public ExamplePage()
{
this.InitializeComponent();
viewModel = new ExamplePageVM();
DataContext = viewModel;
}
}
страницы.
В ViewModel я выполняю некоторую проверку ввода, т. Е. Если пользователь вставляет недопустимое значение с плавающей запятой в TextBox, я хочу сбросить TextBox на значение по умолчанию (например, ноль):
class ExamplePageVM : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private float radius;
public string Radius
{
get => radius.ToString();
set
{
if (radius.ToString() != value)
{
if (!float.TryParse(value, out radius)) radius = 0;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Radius)));
}
}
}
}
Изменение значения в TextBox приводит к тому, что установщик вызывается так, как задумано.Кроме того, событие PropertyChanged
вызывается соответственно.Тем не менее, TextBox по-прежнему содержит недопустимые данные после завершения выполнения установки, что означает, что представление не обновляется правильно.
Согласно первому комментарию к этой записи , решение этой проблемы заключается в использовании <TextBox Text="{x:Bind viewModel.Radius, Mode=TwoWay}"/>
вместо подхода Binding
, показанного выше.Почему это так?В чем разница между Binding
и x:Bind
в этой самой ситуации?