Я Связываю TextBox со свойством, которое имеет плавание типа. Все хорошо работает, я изменяю значение в TextBox, и это обновляется в свойстве. Проблема происходит, когда я делаю пробел TextBox, мое свойство не становится обновленным, это все еще имеет старое значение. Теперь я должен использовать преобразователь в своей привязке для обновления свойства со значением по умолчанию в случае пустого значения от TextBox. Я хочу знать Почему это поведение? Там какое-либо другое решение к этому?
Я бы использовал ctype, как предложил Ник, поскольку он не только быстрее, чем regex, он даже быстрее, чем большинство строковых функций, встроенных в PHP. Но также необходимо убедиться, что это один символ:
if (ctype_alpha($ch) && strlen($ch) == 1) {
// Accept
} else {
// Reject
}
-121--2762264- Реализуйте ShouldHandleReopen: hasVisibleWindows:
в делегате приложения. В вашей реализации закажите окно обратно в. (Убедитесь, что он не освобожден и не освобождается при закрытии.)
См. документацию .
-121--4571457-Свойство не обновляется, поскольку невозможно преобразовать пустую последовательность в плавающую. Есть два способа решить эту проблему.
Первый способ - добавить свойство типа string, связать с ним TextBox и реализовать изменение свойства float. Например:
public partial class Window1 : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Window1()
{
InitializeComponent();
// don't use this as DataContext,
// it's just an example
DataContext = this;
}
private float _FloatProperty;
public float FloatProperty
{
get { return _FloatProperty; }
set
{
_FloatProperty = value;
OnPropertyCahnged("FloatProperty");
}
}
private string _StringProperty;
public string StringProperty
{
get { return _StringProperty; }
set
{
_StringProperty = value;
float newFloatValue;
// I think you want 0 when TextBox is empty, right?
FloatProperty = float.TryParse(_StringProperty, out newFloatValue) ? newFloatValue : 0;
OnPropertyCahnged("StringProperty");
}
}
protected void OnPropertyCahnged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("StringProperty"));
}
}
}
Второй способ - использовать преобразователь:
namespace WpfApplication3
{
public partial class Window1 : Window, INotifyPropertyChanged
{
public static readonly IValueConverter TextBoxConverter = new FloatConverter();
/* code from previous example without StringProperty */
}
public class FloatConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
float f;
if (value is string && float.TryParse(value as string, out f))
{
return f;
}
return 0f;
}
}
}
XAML:
<Window x:Class="WpfApplication3.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication3="clr-namespace:WpfApplication3">
<Grid>
<TextBox Text="{Binding FloatProperty, Converter={x:Static WpfApplication3:Window1.TextBoxConverter}}" />
</Grid>
</Window>
Существует статья о преобразователях
Я предпочитаю первый способ с MVVM образцов .
просто поменяйте переплет так
<TextBlock Text={Binding Path=Name, TargetNullValue='',UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}/>
Я думаю, проблема будет в том, что система привязки соответствует пустому TextBox. Для вас это может быть ноль, но для кого-то другого это может быть Single.NegativeInfinity.