Привязка данных не обновляет, когда TextBox Пуст

Я Связываю TextBox со свойством, которое имеет плавание типа. Все хорошо работает, я изменяю значение в TextBox, и это обновляется в свойстве. Проблема происходит, когда я делаю пробел TextBox, мое свойство не становится обновленным, это все еще имеет старое значение. Теперь я должен использовать преобразователь в своей привязке для обновления свойства со значением по умолчанию в случае пустого значения от TextBox. Я хочу знать Почему это поведение? Там какое-либо другое решение к этому?

5
задан abatishchev 11 May 2012 в 08:10
поделиться

3 ответа

Я бы использовал 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 образцов .

9
ответ дан 18 December 2019 в 10:44
поделиться

просто поменяйте переплет так

<TextBlock Text={Binding Path=Name, TargetNullValue='',UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}/>
7
ответ дан 18 December 2019 в 10:44
поделиться

Я думаю, проблема будет в том, что система привязки соответствует пустому TextBox. Для вас это может быть ноль, но для кого-то другого это может быть Single.NegativeInfinity.

0
ответ дан 18 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: