检测自定义wpf文本框上的绑定错误

时间:2015-10-06 10:42:51

标签: c# wpf mvvm binding textbox

我有一个自定义文本框,它有一个名为valueProperty的dependencyProperty,类型为double nullable。我的问题是该属性绑定为nulbles nullables并且模型上没有nullables,当我尝试放置null并且绑定值不可为空时,这显然会失败,显示红色矩形。我想检测绑定失败并在发生这种情况时分配0。所以我的问题是:有没有办法检测到绑定失败?

我知道我可以使用2个不同的customTextbox来修复它,因为nullables和没有nullables,以及其他方式,只是想知道是否有办法检查绑定是否成功。提前谢谢。

编辑>>>>>

型号:

private double _Temperature;
public double Temperature
{
    get { return _Temperature; }
    set { SetProperty(ref this._Temperature, value); }
}

private double? _Density;
public double? Density
{
    get { return _Density; }
    set { SetProperty(ref this._Density, value); }
}

查看(简化的):

<local:customTextBox Value="{Binding Temperature}"/>
<local:customTextBox Value="{Binding Density}"/>

customTextBox dependencyProperty:

public static readonly DependencyProperty valueProperty =            
DependencyProperty.RegisterAttached(
        "Value",
        typeof(double?),
        typeof(customTextBox),
        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValuePropertyChanged)
        );

    private static void OnValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        customTextBox ctb = d as customTextBox;
        ntb.Value = (double?)e.NewValue;
        //Here I can check the binding fail.
    }

使用解决方案进行编辑&gt;&gt;&gt;&gt;&gt;

我的问题有不同的解决方案,我会列举它们:

@blindmeis 解决方案。这是最简单的一个,但效果较差:

<local:customTextBox Value="{Binding Temperature, TargeNullValue=0}"/>

@Gary H 解决方案。这是我选择的解决方案,因为它完全回答了我的要求,也更容易在我当前的应用程序中实现:

private static void OnValuePropertyChanged(DependencyObject d,     
DependencyPropertyChangedEventArgs e)
{
    customTextBox ctb = d as customTextBox;
    ntb.Value = (double?)e.NewValue;
    if (Validation.GetHasError(d)) 
        {
            //The binding have failed
        }
}

@tomab 解决方案。我认为使用转换器是一个很好的解决方案(可能更好),但我仍然需要保留customTextBox类,因为其他依赖属性,我将需要重构这么多代码。我将牢记未来实施的方式。

谢谢大家的帮助。

2 个答案:

答案 0 :(得分:2)

是的,这是验证错误。 您可以查询附加属性:

var errors=Validation.GetErrors(myTextbox);

有关处理和自定义验证,请参阅: Data validation in WPF

答案 1 :(得分:1)

这是一种使用转换器的方法,它的优点是您可以根据所需的逻辑控制输出值(将显示)的方式。

public class DoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        // if you want to handle `double` too you can uncomment following lines but this is an ugly hack
        // if (value != null && value.GetType() == typeof(double))
        // {
        //    return value;
        // }
        var nullableDouble = (double?)value;
        if (nullableDouble.HasValue)
        {
            return nullableDouble.Value;
        }
        return 0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

xaml可能如下所示:

<UserControl.Resources>
    <converters:DoubleConverter x:Key="DoubleConverter"/>
</UserControl.Resources>

<TextBox Text="{Binding SomeValue, Converter={StaticResource DoubleConverter}}" />

SomeValue必须是double?类型。