Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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
C# DependencyProperty ValidateValueCallback问题_C#_Wpf_Validation_Dependency Properties - Fatal编程技术网

C# DependencyProperty ValidateValueCallback问题

C# DependencyProperty ValidateValueCallback问题,c#,wpf,validation,dependency-properties,C#,Wpf,Validation,Dependency Properties,我向名为a的DependencyProperty添加了ValidateValueCallback。现在在validate回调中,a应与名为B的DependencyProperty的值进行比较。但是如何在静态ValidateValueCallback方法ValidateValueValue(对象值)中访问B的值?谢谢你的提示 示例代码: class ValidateTest : DependencyObject { public static DependencyProperty APro

我向名为a的DependencyProperty添加了ValidateValueCallback。现在在validate回调中,a应与名为B的DependencyProperty的值进行比较。但是如何在静态ValidateValueCallback方法ValidateValueValue(对象值)中访问B的值?谢谢你的提示

示例代码:

class ValidateTest : DependencyObject
{
    public static DependencyProperty AProperty = DependencyProperty.Register("A", typeof(double), typeof(ValidateTest), new PropertyMetadata(), validateValue);
    public static DependencyProperty BProperty = DependencyProperty.Register("B", typeof(double), typeof(ValidateTest));


    static bool validateValue(object value)
    {
        // Given value shall be greater than 0 and smaller than B - but how to access the value of B?

        return (double)value > 0 && value <= /* how to access the value of B ? */
    }
}
类验证测试:DependencyObject
{
public static dependencProperty AProperty=dependencProperty.Register(“A”、typeof(double)、typeof(ValidateTest)、new PropertyMetadata()、validateValue);
public static dependencProperty BProperty=dependencProperty.Register(“B”,typeof(double),typeof(ValidateTest));
静态布尔validateValue(对象值)
{
//给定值应大于0且小于B-但如何获取B的值?

回程(双程)value>0&&value验证回调用于根据一组静态约束检查给定输入值的合理性。在验证回调中,检查正值是验证的正确用法,但检查另一个属性则不是。如果需要确保给定值小于从属属性,则可以应该这样使用:

public static DependencyProperty AProperty = DependencyProperty.Register("A", typeof(double), typeof(ValidateTest), new PropertyMetadata(1.0, null, coerceValue), validateValue);
public static DependencyProperty BProperty = DependencyProperty.Register("B", typeof(double), typeof(ValidateTest), new PropertyMetaData(bChanged));

static object coerceValue(DependencyObject d, object value)
{
    var bVal = (double)d.GetValue(BProperty);

    if ((double)value > bVal)
        return bVal;

    return value;
}

static bool validateValue(object value)
{
    return (double)value > 0;
}
虽然如果设置A>B(像ValidationCallback那样),这不会引发异常,但这实际上是所需的行为。由于您不知道属性的设置顺序,因此应该支持以任何顺序设置属性

如果B的值发生变化,我们还需要告诉WPF强制属性A的值,因为强制值可能会发生变化:

static void bChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    d.CoerceValue(AProperty);
}

非常感谢您的详细回复!标记为答案。我首先必须习惯这种方式(不抛出例外),但好吧,似乎是“官方”方式。