Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何为绑定到数字数据的文本框激发属性集_Wpf_Textbox_Properties_Double_Numeric - Fatal编程技术网

Wpf 如何为绑定到数字数据的文本框激发属性集

Wpf 如何为绑定到数字数据的文本框激发属性集,wpf,textbox,properties,double,numeric,Wpf,Textbox,Properties,Double,Numeric,我刚刚注意到,当发生非数字事件(例如键入字母/空格或清除文本)时,绑定到数字数据的WPF文本框不会触发属性集。当我试图验证一个文本框是否有一个有效的数字时,这就成了一个问题。如果用户键入5并按backspace,则数据绑定属性保持为5,而文本框显示为空!我无法禁用按钮来停止进一步的进程。当绑定到数字数据时,是否仍可以启用非数字通知?或者,我是否被迫使用字符串属性/数据转换器?谢谢。如果您不喜欢默认的转换器,您需要创建自己的转换器,如果输入为空或不可解析,它将返回有效值 public class

我刚刚注意到,当发生非数字事件(例如键入字母/空格或清除文本)时,绑定到数字数据的WPF文本框不会触发
属性集。当我试图验证一个文本框是否有一个有效的数字时,这就成了一个问题。如果用户键入5并按backspace,则数据绑定属性保持为5,而文本框显示为空!我无法禁用按钮来停止进一步的进程。当绑定到数字数据时,是否仍可以启用非数字通知?或者,我是否被迫使用字符串属性/数据转换器?谢谢。

如果您不喜欢默认的转换器,您需要创建自己的转换器,如果输入为空或不可解析,它将返回有效值

public class IntBindingConverter : 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)
    {
        string input = value as string;
        if (String.IsNullOrWhiteSpace(input))
        {
            return 0;
        }
        else
        {
            int outInt;
            if (int.TryParse(input, out outInt))
            {
                return outInt;
            }
            else
            {
                return 0;
            }
        }
    }
}
用法示例:

<TextBox>
    <TextBox.Text>
        <Binding Path="Max">
            <Binding.Converter>
                <vc:IntBindingConverter/>
            </Binding.Converter>
        </Binding>
    </TextBox.Text>
</TextBox>


这可能看起来有点混乱,但通常情况下,您实际上只是阻止用户继续操作。

如果您不喜欢默认的转换器,则需要创建自己的转换器,如果输入为空或不可解析,该转换器将返回有效值

public class IntBindingConverter : 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)
    {
        string input = value as string;
        if (String.IsNullOrWhiteSpace(input))
        {
            return 0;
        }
        else
        {
            int outInt;
            if (int.TryParse(input, out outInt))
            {
                return outInt;
            }
            else
            {
                return 0;
            }
        }
    }
}
用法示例:

<TextBox>
    <TextBox.Text>
        <Binding Path="Max">
            <Binding.Converter>
                <vc:IntBindingConverter/>
            </Binding.Converter>
        </Binding>
    </TextBox.Text>
</TextBox>


这看起来可能有点混乱,但通常情况下,您实际上只是阻止用户继续操作。

我决定对TextBox进行子类化,并覆盖
OnTextChanged()
,因此当此.Text为null/空时,我会将其设置为“0”。由于您对默认转换器的看法可能是正确的,而且您的代码肯定会解决我的问题,所以我接受您的答案。谢谢。对文本框进行子类化对我来说听起来太过分了,但对每个人来说都太过分了…哈哈,不仅仅是因为这个-它还允许我防止字母被打印出来,这更合理,不过,我可能会通过
ValidationRules
使用输入验证。我在viewmodel中实现IDataErrorInfo,在这里我打开columnName并调用
ViewModelBase.Validate(()=>\u model.Property)
。每个属性都应用了ValidationAttribute,该属性指示Validate应如何对其进行验证。这种方法避免了我的XAML的混乱,并为我的模型提供了一种表示它有效的方法。ValidationRules如何让VM/M知道所有属性何时有效?我决定对TextBox进行子类化,并重写
OnTextChanged()
,因此当这个.Text为null/空时,我会将其设置为“0”。由于您对默认转换器的看法可能是正确的,而且您的代码肯定会解决我的问题,所以我接受您的答案。谢谢。对文本框进行子类化对我来说听起来太过分了,但对每个人来说都太过分了…哈哈,不仅仅是因为这个-它还允许我防止字母被打印出来,这更合理,不过,我可能会通过
ValidationRules
使用输入验证。我在viewmodel中实现IDataErrorInfo,在这里我打开columnName并调用
ViewModelBase.Validate(()=>\u model.Property)
。每个属性都应用了ValidationAttribute,该属性指示Validate应如何对其进行验证。这种方法避免了我的XAML的混乱,并为我的模型提供了一种表示它有效的方法。ValidationRules如何让VM/M知道所有属性何时有效?